コード例 #1
0
ファイル: command.py プロジェクト: Jack1007/clubot
    def old(self, stanza, *args):
        """显示聊天历史, 后面可跟昵称查看某人的历史, 或跟时间查看多长时间以内的历史:1h, 2h, 1d"""
        last = " ".join(args)
        m = Logics.get_with_nick(last)
        unit_map = {"h":3600, "m":60, "d":86400}
        header_map = {"h":u"小时", "m":u"分钟", "d":u"天"}
        two_hours_ago = datetime.fromtimestamp(time.time() - 7200)
        header = u"两小时以内的历史消息:"
        kwargs = {"starttime":two_hours_ago}
        if last:
            if m:
                kwargs["jid"] = m.email
                header = u"{0} 发送的历史消息:".format(m.nick)
            else:
                if last[0:-1].isdigit():
                    num, unit = int(last[0:-1]), last[-1].lower()
                    starttime = time.time() - (num * unit_map.get(unit, 3600))
                    starttime = datetime.fromtimestamp(starttime)
                    kwargs["starttime"] = starttime
                    header = u"{0} {1} 之内的历史消息:"\
                            .format(num, header_map.get(unit, u"小时"))

        histories = Logics.get_history(**kwargs)
        bodys = [header]
        for history in histories:
            bodys.append(u"{0} [{1}] {2}".format(history.pubdate,
                                                 history.member.nick,
                                                 history.content))

        self._send_cmd_result(stanza, "\n".join(bodys))
コード例 #2
0
ファイル: clubot.py プロジェクト: huahu/clubot
 def handle_presence_unavailable(self, stanza):
     self.logger.info(r"{0} has been offline".format(stanza.from_jid))
     frm = stanza.from_jid
     if frm.bare().as_string() == USER:
         self.logger.info('bot go to offline')
         self.disconnect()
     Logics.set_offline(frm)
コード例 #3
0
ファイル: command.py プロジェクト: huahu/clubot
 def whois(self, stanza, *args):
     """ 查询用户信息 """
     nick = ' '.join(args[0:])
     m = Logics.get_with_nick(nick)
     if not m:
         self._send_cmd_result(stanza, u"{0} 用户不存在".format(nick))
         return
     bodys = []
     isonline = bool(
         [status.status for status in m.status if status.status])
     status = u"在线" if isonline else u"离线"
     resource = " ".join(s.resource for s in m.status if s.resource)
     rp = Logics.get_today_rp(m.email)
     rp = rp if rp else u"尚未测试"
     say_times = 0 if not m.history else len(m.history)
     level = u"管理员" if m.email in ADMINS else u"成员"
     last_say = u"从未发言" if not m.last_say else m.last_say
     last_change = m.last_change if m.last_change else u"从未修改"
     change_times = Logics.get_info(m.email, "change_nick_times", 0).value
     mode = Logics.get_info(stanza.from_jid, 'mode').value
     is_rece = u"是" if mode != "quiet" else u"否"
     bodys.append(u"昵称: {0}     状态: {1}".format(m.nick, status))
     bodys.append(u"资源: {0}     权限: {1}".format(resource, level))
     bodys.append(u"今日人品: {0}".format(rp))
     bodys.append(u"发言次数: {0}".format(say_times))
     bodys.append(u"最后发言: {0}".format(last_say))
     bodys.append(u"加入时间: {0}".format(m.join_date))
     bodys.append(u"更改昵称次数: {0}".format(change_times))
     bodys.append(u"上次更改时间: {0}".format(last_change))
     bodys.append(u"是否接受消息: {0}".format(is_rece))
     self._send_cmd_result(stanza, "\n".join(bodys))
コード例 #4
0
ファイル: command.py プロジェクト: Jack1007/clubot
 def whois(self, stanza, *args):
     """ 查询用户信息 """
     nick = ' '.join(args[0:])
     m = Logics.get_with_nick(nick)
     if not m:
         self._send_cmd_result(stanza, u"{0} 用户不存在".format(nick))
         return
     bodys = []
     isonline = bool([status.status for status in m.status
                     if status.status])
     status = u"在线" if isonline else u"离线"
     resource = " ".join(s.resource for s in m.status if s.resource)
     rp = Logics.get_today_rp(m.email)
     rp = rp if rp else u"尚未测试"
     say_times = 0 if not m.history else len(m.history)
     level = u"管理员" if m.email in ADMINS else u"成员"
     last_say = u"从未发言" if not m.last_say else m.last_say
     last_change = m.last_change if m.last_change else u"从未修改"
     change_times = Logics.get_info(m.email, "change_nick_times", 0).value
     mode = Logics.get_info(stanza.from_jid, 'mode').value
     is_rece = u"是" if mode != "quiet" else u"否"
     bodys.append(u"昵称: {0}     状态: {1}".format(m.nick, status))
     bodys.append(u"资源: {0}     权限: {1}".format(resource, level))
     bodys.append(u"今日人品: {0}".format(rp))
     bodys.append(u"发言次数: {0}".format(say_times))
     bodys.append(u"最后发言: {0}".format(last_say))
     bodys.append(u"加入时间: {0}".format(m.join_date))
     bodys.append(u"更改昵称次数: {0}".format(change_times))
     bodys.append(u"上次更改时间: {0}".format(last_change))
     bodys.append(u"是否接受消息: {0}".format(is_rece))
     self._send_cmd_result(stanza, "\n".join(bodys))
コード例 #5
0
ファイル: clubot.py プロジェクト: Jack1007/clubot
 def handle_presence_unavailable(self, stanza):
     self.logger.info(r"{0} has been offline".format(stanza.from_jid))
     frm = stanza.from_jid
     if frm.bare().as_string() == USER:
         self.logger.info('bot go to offline')
         self.disconnect()
     Logics.set_offline(frm)
コード例 #6
0
ファイル: command.py プロジェクト: huahu/clubot
    def old(self, stanza, *args):
        """显示聊天历史, 后面可跟昵称查看某人的历史, 或跟时间查看多长时间以内的历史:1h, 2h, 1d"""
        last = " ".join(args)
        m = Logics.get_with_nick(last)
        unit_map = {"h": 3600, "m": 60, "d": 86400}
        header_map = {"h": u"小时", "m": u"分钟", "d": u"天"}
        two_hours_ago = datetime.fromtimestamp(time.time() - 7200)
        header = u"两小时以内的历史消息:"
        kwargs = {"starttime": two_hours_ago}
        if last:
            if m:
                kwargs["jid"] = m.email
                header = u"{0} 发送的历史消息:".format(m.nick)
            else:
                if last[0:-1].isdigit():
                    num, unit = int(last[0:-1]), last[-1].lower()
                    starttime = time.time() - (num * unit_map.get(unit, 3600))
                    starttime = datetime.fromtimestamp(starttime)
                    kwargs["starttime"] = starttime
                    header = u"{0} {1} 之内的历史消息:"\
                            .format(num, header_map.get(unit, u"小时"))

        histories = Logics.get_history(**kwargs)
        bodys = [header]
        for history in histories:
            bodys.append(u"{0} [{1}] {2}".format(history.pubdate,
                                                 history.member.nick,
                                                 history.content))

        self._send_cmd_result(stanza, "\n".join(bodys))
コード例 #7
0
ファイル: command.py プロジェクト: huahu/clubot
 def cs(self, stanza, *args):
     """ 更改状态 """
     if args:
         status = ' '.join(args)
     else:
         status = STATUS
     Logics.set_global_info("status", status)
     self._message_bus.send_status(status)
コード例 #8
0
ファイル: command.py プロジェクト: Jack1007/clubot
 def cs(self, stanza, *args):
     """ 更改状态 """
     if args:
         status = ' '.join(args)
     else:
         status = STATUS
     Logics.set_global_info("status", status)
     self._message_bus.send_status(status)
コード例 #9
0
ファイル: message.py プロジェクト: Jack1007/clubot
 def long_back(body, content):
     nick, url = content.split(" ")
     body = u"{0}\n{1}".format(url, body.split("\n")[0][0:50])
     self.send_back_msg(stanza, u"内容过长,贴到:{0}".format(url))
     self.logger.info("{0} send message {1} to {2!r}"
                         .format(stanza.from_jid, body, members))
     Logics.add_history(stanza.from_jid, 'all', body)
     [self.send_message(stanza, m, "[{0}] {1}".format(nick, body))
      for m in members]
コード例 #10
0
ファイル: command.py プロジェクト: huahu/clubot
 def rm(self, stanza, *args):
     """剔除用户"""
     #XXX 没有效果
     emails = [Logics.get_with_nick(n).email for n in args]
     if len(emails) < 1: return self.help(stanza, 'rm')
     for e in emails:
         jid = JID(e)
         Logics.drop(jid)
         self._message_bus.send_unsubscribe(jid)
コード例 #11
0
ファイル: command.py プロジェクト: Jack1007/clubot
 def rm(self, stanza, *args):
     """剔除用户"""
     #XXX 没有效果
     emails = [Logics.get_with_nick(n).email for n in args]
     if len(emails) < 1: return self.help(stanza, 'rm')
     for e in emails:
         jid = JID(e)
         Logics.drop(jid)
         self._message_bus.send_unsubscribe(jid)
コード例 #12
0
ファイル: clubot.py プロジェクト: Jack1007/clubot
 def handle_presence_unsubscribe(self, stanza):
     self.logger.info(u"{0} canceled presence subscription"
                                                 .format(stanza.from_jid))
     presence = Presence(to_jid = stanza.from_jid.bare(),
                                                 stanza_type = "unsubscribe")
     nick = Logics.get_one(stanza.from_jid).nick
     self.message_bus.send_sys_msg(stanza, u'{0} 离开群'.format(nick))
     Logics.drop(stanza.from_jid.bare())
     r =[stanza.make_accept_response(), presence]
     return r
コード例 #13
0
ファイル: clubot.py プロジェクト: huahu/clubot
 def handle_presence_unsubscribe(self, stanza):
     self.logger.info(u"{0} canceled presence subscription".format(
         stanza.from_jid))
     presence = Presence(to_jid=stanza.from_jid.bare(),
                         stanza_type="unsubscribe")
     nick = Logics.get_one(stanza.from_jid).nick
     self.message_bus.send_sys_msg(stanza, u'{0} 离开群'.format(nick))
     Logics.drop(stanza.from_jid.bare())
     r = [stanza.make_accept_response(), presence]
     return r
コード例 #14
0
    def send_all_msg(self, stanza, body):
        """ 给除了自己的所有成员发送消息 """
        nick = Logics.get_one(stanza.from_jid).nick
        if stanza.from_jid.bare().as_string() == USER:
            return
        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')
        if body.startswith("```"):
            back = partial(self.send_back_msg, stanza)
            self.handle_code(stanza, body, nick, back)

        mode = Logics.get_info(stanza.from_jid, 'mode').value
        if mode == 'quiet':
            body = u'你处于{0},请使用-cd命令切换到 {1} '\
                    u'后发言'.format(MODES[mode], MODES['talk'])
            return self.send_back_msg(stanza, body)

        if body.startswith(">>>"):
            self.cmd_handler.shell(stanza, body.lstrip(">").lstrip())

        members = Logics.get_members(stanza.from_jid)
        members = [m.email for m in members]

        if len(body) > 200:

            def long_back(body, content):
                nick, url = content.split(" ")
                body = u"{0}\n{1}".format(url, body.split("\n")[0][0:50])
                self.send_back_msg(stanza, u"内容过长,贴到:{0}".format(url))
                self.logger.info("{0} send message {1} to {2!r}".format(
                    stanza.from_jid, body, members))
                Logics.add_history(stanza.from_jid, 'all', body)
                [
                    self.send_message(stanza, m,
                                      "[{0}] {1}".format(nick, body))
                    for m in members
                ]

            back = partial(long_back, body)
            self.handle_code(stanza, "```\n" + body, nick, back)
            return

        Logics.add_history(stanza.from_jid, 'all', body)
        self.logger.info("{0} send message {1} to {2!r}".format(
            stanza.from_jid, body, members))
        if body.startswith('/me'):
            body = body.replace('/me', nick + ' ')
        else:
            if nick != "qxbot":
                body = "[{0}] {1}".format(nick, body)
        [self.send_message(stanza, m, body) for m in members]
コード例 #15
0
ファイル: clubot.py プロジェクト: Jack1007/clubot
 def handle_presence_subscribe(self, stanza):
     self.logger.info(u"{0} join us".format(stanza.from_jid))
     frm = stanza.from_jid
     presence = Presence(to_jid = frm, stanza_type = "subscribe")
     Logics.add(frm, None, stanza.show)
     r =[stanza.make_accept_response(), presence]
     if frm not in self.sended:
         self.message_bus.send_sys_msg(stanza, new_member(frm))
         self.message_bus.send_back_msg(stanza, welcome(frm))
         self.sended.append(frm)
     return r
コード例 #16
0
ファイル: clubot.py プロジェクト: huahu/clubot
 def handle_presence_subscribe(self, stanza):
     self.logger.info(u"{0} join us".format(stanza.from_jid))
     frm = stanza.from_jid
     presence = Presence(to_jid=frm, stanza_type="subscribe")
     Logics.add(frm, None, stanza.show)
     r = [stanza.make_accept_response(), presence]
     if frm not in self.sended:
         self.message_bus.send_sys_msg(stanza, new_member(frm))
         self.message_bus.send_back_msg(stanza, welcome(frm))
         self.sended.append(frm)
     return r
コード例 #17
0
 def long_back(body, content):
     nick, url = content.split(" ")
     body = u"{0}\n{1}".format(url, body.split("\n")[0][0:50])
     self.send_back_msg(stanza, u"内容过长,贴到:{0}".format(url))
     self.logger.info("{0} send message {1} to {2!r}".format(
         stanza.from_jid, body, members))
     Logics.add_history(stanza.from_jid, 'all', body)
     [
         self.send_message(stanza, m,
                           "[{0}] {1}".format(nick, body))
         for m in members
     ]
コード例 #18
0
ファイル: message.py プロジェクト: Jack1007/clubot
    def send_all_msg(self, stanza, body):
        """ 给除了自己的所有成员发送消息 """
        nick = Logics.get_one(stanza.from_jid).nick
        if stanza.from_jid.bare().as_string() == USER:
            return
        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')
        if body.startswith("```"):
            back = partial(self.send_back_msg, stanza)
            self.handle_code(stanza, body, nick, back)

        mode = Logics.get_info(stanza.from_jid, 'mode').value
        if mode == 'quiet':
            body = u'你处于{0},请使用-cd命令切换到 {1} '\
                    u'后发言'.format(MODES[mode], MODES['talk'])
            return self.send_back_msg(stanza, body)


        if body.startswith(">>>"):
            self.cmd_handler.shell(stanza, body.lstrip(">").lstrip())

        members = Logics.get_members(stanza.from_jid)
        members = [m.email for m in members]

        if len(body) > 200:
            def long_back(body, content):
                nick, url = content.split(" ")
                body = u"{0}\n{1}".format(url, body.split("\n")[0][0:50])
                self.send_back_msg(stanza, u"内容过长,贴到:{0}".format(url))
                self.logger.info("{0} send message {1} to {2!r}"
                                    .format(stanza.from_jid, body, members))
                Logics.add_history(stanza.from_jid, 'all', body)
                [self.send_message(stanza, m, "[{0}] {1}".format(nick, body))
                 for m in members]

            back = partial(long_back, body)
            self.handle_code(stanza, "```\n" + body, nick, back)
            return

        Logics.add_history(stanza.from_jid, 'all', body)
        self.logger.info("{0} send message {1} to {2!r}"
                            .format(stanza.from_jid, body, members))
        if body.startswith('/me'):
            body = body.replace('/me', nick + ' ')
        else:
            if nick != "qxbot":
                body = "[{0}] {1}".format(nick, body)
        [self.send_message(stanza, m, body) for m in members]
コード例 #19
0
ファイル: honor.py プロジェクト: ParallelBase/clubot
    def rp_honor(self, nick, rp, callback):
        rp = int(rp)
        typ = False
        if rp == 0:
            typ, item, desc = self.RP0
        elif rp == 100:
            typ, item, desc = self.RP100

        if typ:
            Logics.add_honor(nick, rp, typ, item, desc)
            msg = ">>> {0} {1}达到{2}, 获得成就, 载入历史"\
                    .format(nick, item, desc)
            callback(msg)
コード例 #20
0
ファイル: message.py プロジェクト: Jack1007/clubot
 def send_offline_message(self, stanza):
     """ 发送离线消息 """
     show = stanza.show
     frm = stanza.from_jid
     offline_message = Logics.get_info(frm, 'offline_message', '').value
     if offline_message:
         off_msgs = offline_message.split(self.offline_split_symbol)
         offline_message = "\n".join(off_msgs)
         offline_message = "离线期间的消息:\n" + offline_message
         m = self.make_message(frm, 'chat', offline_message)
         self._stream.send(m)
         Logics.set_online(frm, show)
         Logics.set_info(frm, 'offline_message', '')
コード例 #21
0
ファイル: command.py プロジェクト: Jack1007/clubot
    def cd(self, stanza, *args):
        """ 切换模式: cd talk 进入聊天模式, cd quiet 进入安静模式(不接收消息)"""
        mode = " ".join(args)
        if not mode:
            self._send_cmd_result(stanza, u"进入哪里? talk or quiet?")
            return

        if mode in MODES.keys():
            Logics.set_info(stanza.from_jid, "mode", mode)
            body = u"你已进入 {0}".format(MODES[mode])
            self._send_cmd_result(stanza, body)
        else:
            self._send_cmd_result(stanza, u"我不知道 {0} 这种模式".format(mode))
コード例 #22
0
ファイル: command.py プロジェクト: huahu/clubot
    def cd(self, stanza, *args):
        """ 切换模式: cd talk 进入聊天模式, cd quiet 进入安静模式(不接收消息)"""
        mode = " ".join(args)
        if not mode:
            self._send_cmd_result(stanza, u"进入哪里? talk or quiet?")
            return

        if mode in MODES.keys():
            Logics.set_info(stanza.from_jid, "mode", mode)
            body = u"你已进入 {0}".format(MODES[mode])
            self._send_cmd_result(stanza, body)
        else:
            self._send_cmd_result(stanza, u"我不知道 {0} 这种模式".format(mode))
コード例 #23
0
 def send_offline_message(self, stanza):
     """ 发送离线消息 """
     show = stanza.show
     frm = stanza.from_jid
     offline_message = Logics.get_info(frm, 'offline_message', '').value
     if offline_message:
         off_msgs = offline_message.split(self.offline_split_symbol)
         offline_message = "\n".join(off_msgs)
         offline_message = "离线期间的消息:\n" + offline_message
         m = self.make_message(frm, 'chat', offline_message)
         self._stream.send(m)
         Logics.set_online(frm, show)
         Logics.set_info(frm, 'offline_message', '')
コード例 #24
0
    def rp_honor(self, nick, rp, callback):
        rp = int(rp)
        typ = False
        if rp == 0:
            typ, item, desc = self.RP0
        elif rp == 100:
            typ, item, desc = self.RP100

        if typ:
            Logics.add_honor(nick, rp, typ, item, desc)
            msg = ">>> {0} {1}达到{2}, 获得成就, 载入历史"\
                    .format(nick, item, desc)
            callback(msg)
コード例 #25
0
ファイル: clubot.py プロジェクト: Jack1007/clubot
 def handle_roster_received(self, event):
     dbstatus = Logics.get_global_info('status').value
     if not dbstatus:
         status = STATUS
     else:
         status = dbstatus
     p = Presence(status=status)
     self.client.stream.send(p)
     ret = [x.jid.bare() for x in self.roster if x.subscription == 'both']
     self.logger.info(' -- roster:{0}'.format(ret))
     members = Logics.get_members()
     members = [m.email for m in members]
     [Logics.add(frm) for frm in ret if not Logics.get_one(frm)]
     if IMPORT:
         [self.invite_member(JID(m)) for m in members if JID(m) not in ret]
コード例 #26
0
ファイル: clubot.py プロジェクト: huahu/clubot
 def handle_roster_received(self, event):
     dbstatus = Logics.get_global_info('status').value
     if not dbstatus:
         status = STATUS
     else:
         status = dbstatus
     p = Presence(status=status)
     self.client.stream.send(p)
     ret = [x.jid.bare() for x in self.roster if x.subscription == 'both']
     self.logger.info(' -- roster:{0}'.format(ret))
     members = Logics.get_members()
     members = [m.email for m in members]
     [Logics.add(frm) for frm in ret if not Logics.get_one(frm)]
     if IMPORT:
         [self.invite_member(JID(m)) for m in members if JID(m) not in ret]
コード例 #27
0
def exactly_one(lx, ly, lnb, whole):
    """ Returns a Logics object that represents a set of logics formulas which only allows one of all cases (x,y,nb) ,x in lx, y in ly and nb in lnb to be right. If whole is False, it will only return 2 clauses for incompatibilities """
    logics = Logics()
    #Global clause (at least 1)
    if whole:
        c = Clause([])
        for x in lx:
            for y in ly:
                for nb in lnb:
                    v = Var(x, y, nb)
                    c.add(Literal(v, 1))
        logics += c
    #Specific clauses (minus than 1)
    for x in lx:
        for x2 in lx:
            for y in ly:
                for y2 in ly:
                    for nb in lnb:
                        for nb2 in lnb:
                            if (x, y, nb) > (x2, y2, nb2):
                                v1 = Var(x, y, nb)
                                v2 = Var(x2, y2, nb2)
                                l1 = Literal(v1, -1)
                                l2 = Literal(v2, -1)
                                c = Clause([l1, l2])
                                logics += c
    return logics
コード例 #28
0
ファイル: command.py プロジェクト: Jack1007/clubot
    def _run_cmd(self, stanza, body):
        """ 执行命令 """
        cmd = body[1:]
        c, args = self._parse_args(cmd)
        email = get_email(stanza.from_jid)
        cmds = [v.get('name') for v in self._get_cmd()]
        cmds.append('_ping')
        cmds.append('_tq')
        if c not in cmds:
            self._message_bus.send_all_msg(stanza, body)
            return
        try:
            self._logger.info('%s run cmd %s', email, c)
            m =getattr(self, c)(stanza, *args)
        except Exception as e:
            self._logger.warning(e.message)
            nick = Logics.get_one(stanza.from_jid).nick
            errorinfo = traceback.format_exc()
            body = u'{0} run command {1} happend an error:\
                    {2}'.format(nick, c, errorinfo)
            self._message_bus.send_to_admin(stanza, body)
            self._message_bus.send_back_msg(stanza, c + ' 命令异常,已通知管理员')
            return

        return m
コード例 #29
0
ファイル: command.py プロジェクト: ParallelBase/clubot
 def rp(self, stanza, *args):
     """ 测试今日RP """
     frm = stanza.from_jid
     nick = Logics.get_one(frm).nick
     rp = Logics.get_today_rp(frm)
     if rp == None:
         t = random.randrange(1, 10)
         rps = [random.randrange(0, 100) for i in xrange(0, t)]
         rp = rps[random.randrange(0, len(rps) -1)] if len(rps) > 1 else rps[0]
         Logics.set_today_rp(frm, rp)
         body = ">>>{0} 进行了今日人品检测,人品值为 {1}".format(nick, rp)
         self._message_bus.send_sys_msg(stanza, body)
         self._honor.rp_honor(nick, rp, partial(self._message_bus.send_sys_msg, stanza))
     else:
         body = "你已经检测过了今天的人品,人品值为 {0}".format(rp)
         self._send_cmd_result(stanza, body)
コード例 #30
0
ファイル: command.py プロジェクト: Jack1007/clubot
 def nick(self, stanza, *args):
     """更改昵称 eg. -nick yournewnickname"""
     if len(args) < 1: return self.help(stanza, 'nick')
     nick = ' '.join(args[0:])
     frm = stanza.from_jid
     oldnick = Logics.get_one(frm).nick
     if nick == oldnick:
         self._send_cmd_result(stanza, u"你已经在使用这个昵称")
         return
     r = Logics.modify_nick(frm, nick)
     if r:
         body = "%s 更改昵称为 %s" % (oldnick, nick)
         self._message_bus.send_sys_msg(stanza, body)
         self._send_cmd_result(stanza, u'你的昵称现在的已经已经更改为 {0}'.format(nick))
     else:
         self._send_cmd_result(stanza, u'昵称已存在')
コード例 #31
0
ファイル: command.py プロジェクト: Jack1007/clubot
 def ls(self, stanza, *args):
     """列出成员"""
     frm = stanza.from_jid
     femail = get_email(frm)
     members = Logics.get_members()
     onlines = []
     offlines = []
     for m in members:
         if m.email == USER:
             continue
         status = m.status
         isonline = bool([status.status for status in m.status
                      if status.status])
         status_text = " ".join(status.statustext for status in m.status
                                 if status.statustext)
         if m.email == femail:
             onlines.append("** {0}".format(m.nick))
         elif m.email != femail and isonline:
             onlines.append("* {0} {1}".format(m.nick, status_text))
         else:
             offlines.append("  {0}".format(m.nick))
     onlines = sorted(onlines, key = lambda k:k.decode('utf-8')[1],
                      reverse=True)
     offlines = sorted(offlines, key = lambda k:k.decode('utf-8')[1],
                       reverse=True)
     body = []
     body.insert(0, 'Pythoner Club 所有成员(** 表示你自己, * 表示在线):')
     body.extend(onlines)
     body.extend(offlines)
     online_num = len(onlines)
     total = online_num + len(offlines)
     body.append('共列出 {0} 位成员 {1} 位在线'.format(total, online_num))
     self._send_cmd_result(stanza, '\n'.join(body))
コード例 #32
0
ファイル: command.py プロジェクト: huahu/clubot
 def nick(self, stanza, *args):
     """更改昵称 eg. -nick yournewnickname"""
     if len(args) < 1: return self.help(stanza, 'nick')
     nick = ' '.join(args[0:])
     frm = stanza.from_jid
     oldnick = Logics.get_one(frm).nick
     if nick == oldnick:
         self._send_cmd_result(stanza, u"你已经在使用这个昵称")
         return
     r = Logics.modify_nick(frm, nick)
     if r:
         body = "%s 更改昵称为 %s" % (oldnick, nick)
         self._message_bus.send_sys_msg(stanza, body)
         self._send_cmd_result(stanza, u'你的昵称现在的已经已经更改为 {0}'.format(nick))
     else:
         self._send_cmd_result(stanza, u'昵称已存在')
コード例 #33
0
ファイル: command.py プロジェクト: huahu/clubot
    def _run_cmd(self, stanza, body):
        """ 执行命令 """
        cmd = body[1:]
        c, args = self._parse_args(cmd)
        email = get_email(stanza.from_jid)
        cmds = [v.get('name') for v in self._get_cmd()]
        cmds.append('_ping')
        cmds.append('_tq')
        if c not in cmds:
            self._message_bus.send_all_msg(stanza, body)
            return
        try:
            self._logger.info('%s run cmd %s', email, c)
            m = getattr(self, c)(stanza, *args)
        except Exception as e:
            self._logger.warning(e.message)
            nick = Logics.get_one(stanza.from_jid).nick
            errorinfo = traceback.format_exc()
            body = u'{0} run command {1} happend an error:\
                    {2}'.format(nick, c, errorinfo)
            self._message_bus.send_to_admin(stanza, body)
            self._message_bus.send_back_msg(stanza, c + ' 命令异常,已通知管理员')
            return

        return m
コード例 #34
0
ファイル: command.py プロジェクト: huahu/clubot
 def ls(self, stanza, *args):
     """列出成员"""
     frm = stanza.from_jid
     femail = get_email(frm)
     members = Logics.get_members()
     onlines = []
     offlines = []
     for m in members:
         if m.email == USER:
             continue
         status = m.status
         isonline = bool(
             [status.status for status in m.status if status.status])
         status_text = " ".join(status.statustext for status in m.status
                                if status.statustext)
         if m.email == femail:
             onlines.append("** {0}".format(m.nick))
         elif m.email != femail and isonline:
             onlines.append("* {0} {1}".format(m.nick, status_text))
         else:
             offlines.append("  {0}".format(m.nick))
     onlines = sorted(onlines,
                      key=lambda k: k.decode('utf-8')[1],
                      reverse=True)
     offlines = sorted(offlines,
                       key=lambda k: k.decode('utf-8')[1],
                       reverse=True)
     body = []
     body.insert(0, 'Pythoner Club 所有成员(** 表示你自己, * 表示在线):')
     body.extend(onlines)
     body.extend(offlines)
     online_num = len(onlines)
     total = online_num + len(offlines)
     body.append('共列出 {0} 位成员 {1} 位在线'.format(total, online_num))
     self._send_cmd_result(stanza, '\n'.join(body))
コード例 #35
0
 def get_grid_logics_data(self):
     logics = Logics()
     #Use grid data
     for y, line in enumerate(self.grid):
         for x, nb in enumerate(line):
             if nb != 0:
                 logics += Clause([Literal(Var(x, y, nb - 1), 1)])
     return logics
コード例 #36
0
 def send_message(self, stanza, to, body, log=False):
     """ 发送消息
         `stanza`   - 消息节
         `to`       - 接收人 接收人不在线发送离线消息
         `body`     - 消息主体
         `log`      - 记录历史消息
     """
     if to == USER:
         return
     if log:
         Logics.add_history(stanza.from_jid, to, body)
     if Logics.is_online(to):
         mode = Logics.get_info(to, 'mode').value
         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 = Logics.get_info(to, 'offline_message', '').value
         off_msgs = offline_message.split(self.offline_split_symbol)
         if len(off_msgs) >= 10:
             offline_message = self.offline_split_symbol.join(off_msgs[-9:])
         offline_message += self.offline_split_symbol + body
         Logics.set_info(to, 'offline_message', offline_message)
コード例 #37
0
ファイル: message.py プロジェクト: Jack1007/clubot
 def send_message(self, stanza, to, body, log = False):
     """ 发送消息
         `stanza`   - 消息节
         `to`       - 接收人 接收人不在线发送离线消息
         `body`     - 消息主体
         `log`      - 记录历史消息
     """
     if to == USER:
         return
     if log:
         Logics.add_history(stanza.from_jid, to, body)
     if Logics.is_online(to):
         mode = Logics.get_info(to, 'mode').value
         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 = Logics.get_info(to, 'offline_message', '').value
         off_msgs = offline_message.split(self.offline_split_symbol)
         if len(off_msgs) >= 10:
             offline_message = self.offline_split_symbol.join(off_msgs[-9:])
         offline_message += self.offline_split_symbol +  body
         Logics.set_info(to, 'offline_message', offline_message)
コード例 #38
0
ファイル: command.py プロジェクト: huahu/clubot
 def r(self, stanza, *args):
     """20面骰子,使用:1d20+1 攻击 @submit by:欧剃 @add by: eleven.i386"""
     nick = Logics.get_one(stanza.from_jid).nick
     try:
         result = roll(' '.join(args))
         body = ">>> {0} {1}".format(nick, result)
         self._message_bus.send_sys_msg(stanza, body)
     except:
         body = u'请发送: -roll 1d20+n A (n是数字 A是动作比如攻击)'
         self._send_cmd_result(stanza, body)
コード例 #39
0
 def rp(self, stanza, *args):
     """ 测试今日RP """
     frm = stanza.from_jid
     nick = Logics.get_one(frm).nick
     rp = Logics.get_today_rp(frm)
     if rp == None:
         t = random.randrange(1, 10)
         rps = [random.randrange(0, 100) for i in xrange(0, t)]
         rp = rps[random.randrange(0,
                                   len(rps) -
                                   1)] if len(rps) > 1 else rps[0]
         Logics.set_today_rp(frm, rp)
         body = ">>>{0} 进行了今日人品检测,人品值为 {1}".format(nick, rp)
         self._message_bus.send_sys_msg(stanza, body)
         self._honor.rp_honor(
             nick, rp, partial(self._message_bus.send_sys_msg, stanza))
     else:
         body = "你已经检测过了今天的人品,人品值为 {0}".format(rp)
         self._send_cmd_result(stanza, body)
コード例 #40
0
ファイル: command.py プロジェクト: Jack1007/clubot
 def r(self,stanza,*args):
     """20面骰子,使用:1d20+1 攻击 @submit by:欧剃 @add by: eleven.i386"""
     nick = Logics.get_one(stanza.from_jid).nick
     try:
         result = roll(' '.join(args))
         body = ">>> {0} {1}".format(nick, result)
         self._message_bus.send_sys_msg(stanza, body)
     except:
         body = u'请发送: -roll 1d20+n A (n是数字 A是动作比如攻击)'
         self._send_cmd_result(stanza, body)
コード例 #41
0
ファイル: command.py プロジェクト: huahu/clubot
 def mt(self, stanza, *args):
     """单独给某用户发消息"""
     if len(args) <= 1: return self.help(stanza, 'msgto')
     nick = args[0]
     receiver = Logics.get_with_nick(nick=nick).email
     if receiver == stanza.from_jid.bare().as_string():
         self._send_cmd_result(stanza, "请不要自言自语")
         return
     body = ' '.join(args[1:])
     if not receiver:
         self._send_cmd_result(stanza, "%s 用户不存在" % nick)
     else:
         self._message_bus.send_private_msg(stanza, receiver, body)
コード例 #42
0
ファイル: command.py プロジェクト: Jack1007/clubot
 def mt(self, stanza, *args):
     """单独给某用户发消息"""
     if len(args) <= 1: return self.help(stanza, 'msgto')
     nick = args[0]
     receiver = Logics.get_with_nick(nick = nick).email
     if receiver == stanza.from_jid.bare().as_string():
         self._send_cmd_result(stanza, "请不要自言自语")
         return
     body = ' '.join(args[1:])
     if not receiver:
         self._send_cmd_result(stanza, "%s 用户不存在" % nick)
     else:
         self._message_bus.send_private_msg(stanza, receiver, body)
コード例 #43
0
ファイル: clubot.py プロジェクト: Jack1007/clubot
    def __init__(self):
        my_jid = JID(USER+'/Bot')
        self.my_jid = my_jid
        settings = XMPPSettings({
                            "software_name": "Clubot",
                            "software_version": __version__,
                            "software_os": "Linux",
                            "tls_verify_peer": False,
                            "starttls": True,
                            "ipv6":False,
                            "poll_interval": 10,
                            })

        settings["password"] = PASSWORD
        version_provider = VersionProvider(settings)
        self.connected = False
        mainloop = TornadoMainLoop(settings)
        self.client = Client(my_jid, [self, version_provider], settings, mainloop)
        #self.client = Client(my_jid, [self, version_provider], settings)
        self.logger = get_logger()
        self.trytimes = 0
        self.sended = []
        Logics.empty_status()
コード例 #44
0
ファイル: command.py プロジェクト: huahu/clubot
        def read_shell(resp):
            result = resp.read()
            nick = Logics.get_one(stanza.from_jid).nick
            if not result:
                nick = "{0}:[OK]".format(nick)
            else:
                nick = "{0}:[OUT]".format(nick)

            if len(result) > 200:
                callback = partial(self._message_bus.send_sys_msg, stanza)
                self._paste(stanza, "python", result, nick, callback)
            else:
                self._message_bus.send_sys_msg(stanza,
                                               u"{0} {1}".format(nick, result))
コード例 #45
0
ファイル: command.py プロジェクト: Jack1007/clubot
        def read_shell(resp):
            result = resp.read()
            nick = Logics.get_one(stanza.from_jid).nick
            if not result:
                nick = "{0}:[OK]".format(nick)
            else:
                nick = "{0}:[OUT]".format(nick)

            if len(result) > 200:
                callback = partial(self._message_bus.send_sys_msg, stanza)
                self._paste(stanza, "python", result, nick, callback)
            else:
                self._message_bus.send_sys_msg(stanza, u"{0} {1}"
                                               .format(nick, result))
コード例 #46
0
ファイル: message.py プロジェクト: hengmyj/clubot
    def send_offline_message(self, stanza):
        """ 发送离线消息 """
        show = stanza.show
        frm = stanza.from_jid
        offline_message = Logics.get_info(frm, 'offline_message', '').value
        if offline_message:
            temp_msgs = offline_message.split(self.offline_split_symbol)
            off_msgs = []

            for m in temp_msgs:
                ms = m.split(" ")
                date = " ".join(ms[:2])
                msg = " ".join(ms[2:])
                date = nicetime(date)
                off_msgs.append(date + " " + msg)

            offline_message = "\n".join(off_msgs)
            offline_message = "离线期间的消息:\n" + offline_message
            if len(off_msgs) == 10:
                offline_message += "\n(仅显示最近10条, 更多历史消息请使用 -old 查看)"
            m = self.make_message(frm, 'chat', offline_message)
            self._stream.send(m)
            Logics.set_online(frm, show)
            Logics.set_info(frm, 'offline_message', '')
コード例 #47
0
ファイル: message.py プロジェクト: ParallelBase/clubot
    def send_offline_message(self, stanza):
        """ 发送离线消息 """
        show = stanza.show
        frm = stanza.from_jid
        offline_message = Logics.get_info(frm, 'offline_message', '').value
        if offline_message:
            temp_msgs = offline_message.split(self.offline_split_symbol)
            off_msgs = []

            for m in temp_msgs:
                ms = m.split(" ")
                date = " ".join(ms[:2])
                msg = " ".join(ms[2:])
                date = nicetime(date)
                off_msgs.append(date + " " + msg)

            offline_message = "\n".join(off_msgs)
            offline_message = "离线期间的消息:\n" + offline_message
            if len(off_msgs) == 10:
                offline_message += "\n(仅显示最近10条, 更多历史消息请使用 -old 查看)"
            m = self.make_message(frm, 'chat', offline_message)
            self._stream.send(m)
            Logics.set_online(frm, show)
            Logics.set_info(frm, 'offline_message', '')
コード例 #48
0
ファイル: clubot.py プロジェクト: huahu/clubot
    def __init__(self):
        my_jid = JID(USER + '/Bot')
        self.my_jid = my_jid
        settings = XMPPSettings({
            "software_name": "Clubot",
            "software_version": __version__,
            "software_os": "Linux",
            "tls_verify_peer": False,
            "starttls": True,
            "ipv6": False,
            "poll_interval": 10,
        })

        settings["password"] = PASSWORD
        version_provider = VersionProvider(settings)
        self.connected = False
        mainloop = TornadoMainLoop(settings)
        self.client = Client(my_jid, [self, version_provider], settings,
                             mainloop)
        #self.client = Client(my_jid, [self, version_provider], settings)
        self.logger = get_logger()
        self.trytimes = 0
        self.sended = []
        Logics.empty_status()
コード例 #49
0
ファイル: command.py プロジェクト: Jack1007/clubot
 def rp(self, stanza, *args):
     """ 测试今日RP """
     frm = stanza.from_jid
     nick = Logics.get_one(frm).nick
     rp = Logics.get_today_rp(frm)
     if not rp:
         t = random.randrange(1, 10)
         rps = [random.randrange(0, 100) for i in xrange(0, t)]
         rp = rps[random.randrange(0, len(rps) -1)] if len(rps) > 1 else rps[0]
         Logics.set_info(frm, "rp", rp)
         Logics.set_info(frm, "rp_date", time.time())
         body = ">>>{0} 进行了今日人品检测,人品值为 {1}".format(nick, rp)
         self._message_bus.send_sys_msg(stanza, body)
     else:
         body = "你已经检测过了今天的人品,人品值为 {0}".format(rp)
         self._send_cmd_result(stanza, body)
コード例 #50
0
ファイル: command.py プロジェクト: huahu/clubot
 def rp(self, stanza, *args):
     """ 测试今日RP """
     frm = stanza.from_jid
     nick = Logics.get_one(frm).nick
     rp = Logics.get_today_rp(frm)
     if not rp:
         t = random.randrange(1, 10)
         rps = [random.randrange(0, 100) for i in xrange(0, t)]
         rp = rps[random.randrange(0,
                                   len(rps) -
                                   1)] if len(rps) > 1 else rps[0]
         Logics.set_info(frm, "rp", rp)
         Logics.set_info(frm, "rp_date", time.time())
         body = ">>>{0} 进行了今日人品检测,人品值为 {1}".format(nick, rp)
         self._message_bus.send_sys_msg(stanza, body)
     else:
         body = "你已经检测过了今天的人品,人品值为 {0}".format(rp)
         self._send_cmd_result(stanza, body)
コード例 #51
0
    def get_logics(self):
        logics = Logics()
        #Cases
        for i in range(9):
            for j in range(9):
                logics += exactly_one([i], [j], range(0, 9), True)
        #Lines
        for j in range(9):
            for nb in range(0, 9):
                logics += exactly_one(range(9), [j], [nb], False)

        #Column
        for i in range(9):
            for nb in range(0, 9):
                logics += exactly_one([i], range(9), [nb], False)

        #Square
        for s in range(3):
            for s2 in range(3):
                for nb in range(0, 9):
                    logics += exactly_one(range(3 * s, 3 * (s + 1)),
                                          range(3 * s2, 3 * (s2 + 1)), [nb],
                                          False)
        return logics + self.get_grid_logics_data()
コード例 #52
0
ファイル: command.py プロジェクト: huahu/clubot
 def me(self, stanza, *args):
     """ 查看自己的详细信息 """
     self.whois(stanza, Logics.get_one(stanza.from_jid).nick)
コード例 #53
0
ファイル: clubot.py プロジェクト: Jack1007/clubot
 def handle_presence_available(self, stanza):
     self.logger.info(r"{0} has been online".format(stanza.from_jid))
     if stanza.from_jid.bare().as_string() != USER:
         Logics.set_online(stanza.from_jid, stanza.show)
     self.message_bus.send_offline_message(stanza)
コード例 #54
0
ファイル: message.py プロジェクト: Jack1007/clubot
 def send_private_msg(self, stanza, to, body):
     """ 发送私信 """
     frm = stanza.from_jid
     nick = Logics.get_one(frm).nick
     body = "[%s 悄悄对你说] %s" % (nick, body)
     self.send_message(stanza, to, body, True)
コード例 #55
0
ファイル: message.py プロジェクト: Jack1007/clubot
 def send_sys_msg(self, stanza, body):
     """ 发送系统消息 """
     members = Logics.get_members()
     members = [m.email for m in members]
     [self.send_message(stanza, m, body) for m in members]
コード例 #56
0
ファイル: command.py プロジェクト: Jack1007/clubot
 def me(self, stanza, *args):
     """ 查看自己的详细信息 """
     self.whois(stanza, Logics.get_one(stanza.from_jid).nick)
コード例 #57
0
ファイル: clubot.py プロジェクト: Jack1007/clubot
 def handle_presence_unsubscribed(self, stanza):
     self.logger.info(u"{0!r} acknowledged our subscrption cancelation"
                                                 .format(stanza.from_jid))
     Logics.drop(stanza.from_jid.bare())
     return True
コード例 #58
0
ファイル: clubot.py プロジェクト: huahu/clubot
 def handle_presence_available(self, stanza):
     self.logger.info(r"{0} has been online".format(stanza.from_jid))
     if stanza.from_jid.bare().as_string() != USER:
         Logics.set_online(stanza.from_jid, stanza.show)
     self.message_bus.send_offline_message(stanza)
コード例 #59
0
ファイル: clubot.py プロジェクト: huahu/clubot
 def handle_presence_unsubscribed(self, stanza):
     self.logger.info(
         u"{0!r} acknowledged our subscrption cancelation".format(
             stanza.from_jid))
     Logics.drop(stanza.from_jid.bare())
     return True