def mv(self, stanza, *args): """ 移动用户到指定频道 """ if len(args) < 2: body = u"Usage: -mv NICK CHANNLE" return self._send_cmd_result(stanza, body) if args[1] == ".": distch = get_info("channel", stanza.from_jid) else: distch = args[1] if args[0] == "*": members = get_members(stanza.from_jid) emails = [v for v in members if get_info("channel", v) != distch] else: info = get_member(nick=args[0]) emails = [info.get("email")] channel = get_channel(distch) if not emails: body = u"{0} 成员不存在".format(args[0]) return self._send_cmd_result(stanza, body) if not channel: body = u"{0} 频道不存在".format(args[1]) return self._send_cmd_result(stanza, body) nick = get_nick(stanza.from_jid) body = "{0} 将你移动到 {1} 频道".format(nick, distch) nicks = [] for email in emails: nicks.append(get_nick(email)) self._switch_channel(email, distch) self._message_bus.send_message(stanza, email, body) body = "你将 {0} 移动到 {1} 频道".format(",".join(nicks), distch) self._send_cmd_result(stanza, body)
def _switch_channel(self, email, channel): """ 切换频道 """ oldch = get_info("channel", email) self._logger.info("{0} switch channel from {1} to {2}".format(email, oldch, channel)) del_channel_user(oldch) add_info("channel", channel, email) add_channel_user(channel)
def send_offline_message(self, stanza): """ 发送离线消息 """ show = stanza.show frm = stanza.from_jid offline_message = get_info('offline_message', frm) if offline_message: offline_message = "离线期间的消息:\n" + offline_message m = self.make_message(frm, 'normal', offline_message) self._stream.send(m) set_online(frm, show) add_info('offline_message', '', frm)
def _ls_channel_users(self, stanza): channel = get_info("channel", stanza.from_jid) channel = channel if channel else "main" frm = stanza.from_jid femail = get_email(frm) members = get_members_info() onlinebody = [] offlinebody = [] els = [] for m in members: email = m.get("email") ch = get_info("channel", email) ch = ch if ch else "main" if ch != channel: continue if email in els: continue els.append(email) if email == femail: r = "**{0}".format(m.get("nick")) onlinebody.append(r) elif m.get("isonline"): r = "*{0}".format(m.get("nick")) if m.get("status"): r += " " + m.get("status") onlinebody.append(r) else: r = " " + m.get("nick") offlinebody.append(r) onlinebody = sorted(onlinebody, key=lambda k: k.decode("utf-8")[1], reverse=False) offlinebody = sorted(offlinebody, key=lambda k: k.decode("utf-8")[1], reverse=False) body = [] body.append("当前频道({0})所有成员".format(channel)) body.extend(onlinebody) body.extend(offlinebody) online_num = len(onlinebody) total = online_num + len(offlinebody) body.append("共列出 {0} 位成员 {1} 位在线".format(total, online_num)) self._send_cmd_result(stanza, "\n".join(body)) return
def send_message(self, stanza, to, body, log = False): """ 发送消息 `stanza` - 消息节 `to` - 接收人 接收人不在线发送离线消息 `body` - 消息主体 `log` - 记录历史消息 """ if log: add_history(stanza.from_jid, to, body) if is_online(to): mode = get_info('mode', to) if mode == 'talk' or not mode: if isinstance(to, (str, unicode)): to = JID(to) self.logger.debug("send '{0}' to {1!r}".format(body, to)) typ = stanza.stanza_type self._stream.send(self.make_message(to, typ, body)) else: body = NOW() + ' ' + body self.logger.debug("store offline message'{0}' for {1!r}" .format(body, to)) offline_message = get_info('offline_message', to, '') offline_message += '\n' + body add_info('offline_message', offline_message, to)
def send_all_msg(self, stanza, body): """ 给除了自己的所有成员发送消息 """ if cityid(body.strip()): return self.send_command(stanza, '-_tq ' + body.strip()) if body.strip() == 'help': return self.send_command(stanza, '-help') if body.strip() == 'ping': return self.send_command(stanza, '-_ping') mode = get_info('mode', stanza.from_jid) if mode == 'quiet': body = u'你处于{0},请使用-cd命令切换到 {1} '\ u'后发言'.format(MODES[mode], MODES['talk']) return self.send_back_msg(stanza, body) add_history(stanza.from_jid, 'all', body) members = get_members(stanza.from_jid) current = get_info('channel', stanza.from_jid, 'main') members = [m for m in members if get_info('channel', m, 'main') == current] self.logger.info("{0} send message {1} to {2!r}" .format(stanza.from_jid, body, members)) nick = get_nick(stanza.from_jid) body = "[{0}] {1}".format(nick, body) [self.send_message(stanza, m, body) for m in members]
def cd(self, stanza, *args): """ 进入模式/频道 """ mode = args[0] if len(args) >= 1 else None channels = get_channel() cnames = [v.get("name") for v in channels] if not mode or (mode not in self._modes and mode not in cnames): body = "Usage:\n\ -cd MODE/CHANNEL 进入MODE模式,使用-ls m查看允许的模式" else: if mode in self._modes: add_info("mode", mode, stanza.from_jid) body = " 你已进入{0}".format(self._modes[mode]) else: current_channel = [v for v in channels if v.get("name") == mode][0] uc = get_info("channel", stanza.from_jid) uc = uc if uc else "main" if uc == current_channel.get("name"): body = u"你已经在 {0} 频道".format(mode) return self._send_cmd_result(stanza, body) else: del_channel_user(uc) if current_channel.get("passwd"): pwd = args[1] if len(args) == 2 else None if pwd == current_channel.get("passwd"): add_info("channel", mode, stanza.from_jid) add_channel_user(mode) body = " 你已进入 {0} 频道".format(mode) else: body = " 频道密码错误" if not pwd: body = u"频道已加密,需要密码" else: add_info("channel", mode, stanza.from_jid) add_channel_user(mode) body = " 你已进入 {0} 频道".format(mode) self._send_cmd_result(stanza, body)