Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
    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]
Ejemplo n.º 7
0
    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)