我正在编写用户脚本,以便与交互。当事情发生时,我想得到通知(例如添加、删除、编辑、用户加入等)。我知道我可以使用MutationObserver
来监视DOM的更改,但是有什么方法可以在发生这些事件时向SE聊天系统注册回调吗?
发布于 2019-03-13 16:14:07
您可以向Stack注册回调,该回调在DOM发生更改之前被调用(也就是说,如果要在DOM中找到新消息,则需要在DOM更改后使用setTimeout()
进行操作)。回调可以用CHAT.addEventHandlerHook(callback)
注册,它接受一个函数作为它的单个参数。
在大多数聊天系统处理事件之前,按照添加的顺序执行已注册的回调。如果任何回调更改了参数0中的event
对象,则该更改将传播到任何后续回调,并在所有已注册回调执行后聊天系统更新DOM时使用。如果任何回调返回一个真实值,则不再执行回调,聊天系统也不会对事件进行任何正常处理(即DOM不会被更新)。实际上,从回调中返回一个真实值将取消事件。
聊天系统本身使用CHAT.addEventHandlerHook(callback)
添加自己的回调,以便对某些事件类型进行部分处理。这意味着以下事件类型的处理将在其他回调之前和之后进行:MessageDeleted
、MessageEdited
、MessageFlagged
、MessagePosted
、MessageReply
、UserEntered
、UserLeft
、UserMentioned
和UserNameOrAvatarChanged
。
回调函数传递的参数如下所示:
arguments: {
0: {
event_type: 1,
time_stamp: 1552493100,
content: 'Test message with a tag <a href="//stackoverflow.com/questions/tagged/some-tag"><span class="ob-post-tag" style="background-color: #E0EAF1; color: #3E6D8E; border-color: #3E6D8E; border-style: solid;">some-tag</span></a>.',
id: 92913194,
user_id: 3773011,
user_name: "Makyen",
room_id: 68414,
room_name: "SOCVR Testing Facility",
message_id: 45625173
},
1: false,
2: 92913190
}
第一个参数是chat "event“对象。这是味精的答案有一个可能的键/值对的列表和描述,至少对于event_type == 1
是这样。对于上面没有显示的消息,最常见的密钥/值对可能包括show_parent
和parent_id
。只有当消息是对在show_parent
中指示的消息ID的实际答复时,才会出现parent_id
键。parent_id
将出现在实际的回复和@
页面中。对于@
pings,parent_id
将是点播用户的最新消息,show_parent
不会出现。
事件的类型由event_type
的数值表示。有34种类型可以用于event_type
。
const chatEventTypes = {
1: 'MessagePosted',
2: 'MessageEdited',
3: 'UserEntered',
4: 'UserLeft',
5: 'RoomNameChanged',
6: 'MessageStarred',
7: 'DebugMessage',
8: 'UserMentioned',
9: 'MessageFlagged',
10: 'MessageDeleted',
11: 'FileAdded',
12: 'ModeratorFlag',
13: 'UserSettingsChanged',
14: 'GlobalNotification',
15: 'AccessLevelChanged',
16: 'UserNotification',
17: 'Invitation',
18: 'MessageReply',
19: 'MessageMovedOut',
20: 'MessageMovedIn',
21: 'TimeBreak',
22: 'FeedTicker',
29: 'UserSuspended',
30: 'UserMerged',
34: 'UserNameOrAvatarChanged',
};
回调将接收用户所在的所有房间的事件,因此您需要通过将room_id
与当前房间匹配来过滤它们。
事件类型列表是从SE的最小化chat JavaScript中复制的。
https://stackapps.com/questions/8268
复制相似问题