首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通知我在SE聊天中的事件?

如何通知我在SE聊天中的事件?
EN

Stack Apps用户
提问于 2019-03-13 16:14:07
回答 1查看 419关注 0票数 5

我正在编写用户脚本,以便与交互。当事情发生时,我想得到通知(例如添加、删除、编辑、用户加入等)。我知道我可以使用MutationObserver来监视DOM的更改,但是有什么方法可以在发生这些事件时向SE聊天系统注册回调吗?

EN

回答 1

Stack Apps用户

发布于 2019-03-13 16:14:07

您可以向Stack注册回调,该回调在DOM发生更改之前被调用(也就是说,如果要在DOM中找到新消息,则需要在DOM更改后使用setTimeout()进行操作)。回调可以用CHAT.addEventHandlerHook(callback)注册,它接受一个函数作为它的单个参数。

在大多数聊天系统处理事件之前,按照添加的顺序执行已注册的回调。如果任何回调更改了参数0中的event对象,则该更改将传播到任何后续回调,并在所有已注册回调执行后聊天系统更新DOM时使用。如果任何回调返回一个真实值,则不再执行回调,聊天系统也不会对事件进行任何正常处理(即DOM不会被更新)。实际上,从回调中返回一个真实值将取消事件。

聊天系统本身使用CHAT.addEventHandlerHook(callback)添加自己的回调,以便对某些事件类型进行部分处理。这意味着以下事件类型的处理将在其他回调之前和之后进行:MessageDeletedMessageEditedMessageFlaggedMessagePostedMessageReplyUserEnteredUserLeftUserMentionedUserNameOrAvatarChanged

回调函数传递的参数如下所示:

代码语言:javascript
运行
复制
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_parentparent_id。只有当消息是对在show_parent中指示的消息ID的实际答复时,才会出现parent_id键。parent_id将出现在实际的回复和@页面中。对于@ pings,parent_id将是点播用户的最新消息,show_parent不会出现。

事件的类型由event_type的数值表示。有34种类型可以用于event_type

代码语言:javascript
运行
复制
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中复制的。

票数 8
EN
页面原文内容由Stack Apps提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackapps.com/questions/8268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档