UNPKG

icqq

Version:

QQ protocol for NodeJS!

120 lines (119 loc) 3.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Guild = exports.GuildRole = void 0; const core_1 = require("./core"); const constants_1 = require("./core/constants"); const channel_1 = require("./channel"); /** 频道权限 */ var GuildRole; (function (GuildRole) { /** 成员 */ GuildRole[GuildRole["Member"] = 1] = "Member"; /** 频道管理员 */ GuildRole[GuildRole["GuildAdmin"] = 2] = "GuildAdmin"; /** 频道主 */ GuildRole[GuildRole["Owner"] = 4] = "Owner"; /** 子频道管理员 */ GuildRole[GuildRole["ChannelAdmin"] = 5] = "ChannelAdmin"; })(GuildRole || (exports.GuildRole = GuildRole = {})); const members4buf = core_1.pb.encode({ 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, }); const weakmap = new WeakMap(); /** 频道 */ class Guild { constructor(c, guild_id) { this.c = c; this.guild_id = guild_id; /** 频道名 */ this.guild_name = ""; /** 子频道字典 */ this.channels = new Map(); (0, constants_1.lock)(this, "guild_id"); } static as(guild_id) { const guild = this.guilds.get(guild_id); if (!guild) throw new Error(`尚未加入Guild(${guild_id})`); return guild; } /** * 发送消息 * @param channel_id 子频道id * @param message 消息内容 */ async sendMsg(channel_id, message) { let channel = this.channels.get(channel_id); if (!channel) throw new Error(`你尚未加入频道:` + channel_id); return channel.sendMsg(message); } _renew(guild_name, proto) { this.guild_name = guild_name; if (!Array.isArray(proto)) proto = [proto]; const tmp = new Set(); for (const p of proto) { const id = String(p[1]), name = String(p[8]), notify_type = p[7], channel_type = p[9]; tmp.add(id); if (!this.channels.has(id)) this.channels.set(id, new channel_1.Channel(this, id)); const channel = this.channels.get(id); channel._renew(name, notify_type, channel_type); } for (let [id, _] of this.channels) { if (!tmp.has(id)) this.channels.delete(id); } } /** 获取频道成员列表 */ async getMemberList() { let index = 0; // todo member count over 500 const body = core_1.pb.encode({ 1: BigInt(this.guild_id), 2: 3, 3: 0, 4: members4buf, 6: index, 8: 500, 14: 2, }); const rsp = await this.c.sendOidbSvcTrpcTcp("OidbSvcTrpcTcp.0xf5b_1", body); const list = []; const members = Array.isArray(rsp[5]) ? rsp[5] : [rsp[5]]; const admins = Array.isArray(rsp[25]) ? rsp[25] : [rsp[25]]; for (const p of admins) { const role = p[1]; if (!p[2]) continue; const m = Array.isArray(p[2]) ? p[2] : [p[2]]; for (const p2 of m) { list.push({ tiny_id: String(p2[8]), card: String(p2[2]), nickname: String(p2[3]), role, join_time: p2[4], }); } } for (const p of members) { list.push({ tiny_id: String(p[8]), card: String(p[2]), nickname: String(p[3]), role: GuildRole.Member, join_time: p[4], }); } return list; } } exports.Guild = Guild;