-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchannelevent.ts
88 lines (78 loc) · 2.51 KB
/
channelevent.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import { DMChannel, Message, PartialDMChannel, PartialMessage, TextChannel } from "discord.js";
import { botlog } from "./botlog";
import { client } from "./client";
type DMMessage = Message&{channel:DMChannel|PartialDMChannel};
type ChannelMessage = Message&{channel:TextChannel};
const dmListeners:((message:DMMessage)=>void)[] = [];
const targets = new Map<string, ChannelTarget<ChannelMessage>>();
export class ChannelTarget<ChannelType> {
private readonly messageListeners:((msg:Message&{channel:ChannelType})=>void)[] = [];
private readonly deleteListeners:((msg:(Message|PartialMessage)&{channel:ChannelType})=>void)[] = [];
fire(event:string, param:any):void {
let list:((param:any)=>void)[];
switch (event) {
case 'message':
list = this.messageListeners;
break;
case 'delete':
list = this.deleteListeners;
break;
default:
return;
}
for (const cb of list) {
try {
cb(param);
} catch (err) {
botlog((err instanceof Error ? err.stack : err)+'');
}
}
}
on(event:'message', cb:(param:Message&{channel:ChannelType})=>void):void;
on(event:'delete', cb:(param:(Message|PartialMessage)&{channel:ChannelType})=>void):void;
on(event:string, cb:(param:any)=>void):void {
switch (event) {
case 'message':
this.messageListeners.push(cb);
break;
case 'delete':
this.deleteListeners.push(cb);
break;
}
}
static getInstance(name:string):ChannelTarget<ChannelMessage> {
let target = targets.get(name);
if (target == null) targets.set(name, target = new ChannelTarget);
return target;
}
}
export function onDmEvent(cb:(message:DMMessage)=>void):void {
dmListeners.push(cb);
}
client.on('messageDelete', msg=>{
switch (msg.channel.type) {
case 'DM':
break;
case 'GUILD_TEXT':
const target = targets.get(msg.channel.name);
if (target != null) {
target.fire('delete', msg);
}
break;
}
});
client.on('messageCreate', msg=>{
switch (msg.channel.type) {
case 'DM':
for (const listener of dmListeners) {
listener(msg as DMMessage);
}
break;
case 'GUILD_TEXT':
const target = targets.get(msg.channel.name);
if (target != null) {
target.fire('message', msg);
}
break;
}
});