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))
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)
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))
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))
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))
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)
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]
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)
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
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
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]
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
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
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 ]
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]
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)
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', '')
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))
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]
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
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
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)
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'昵称已存在')
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))
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
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))
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
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)
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)
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)
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)
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)
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)
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)
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()
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))
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))
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', '')
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()
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)
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)
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()
def me(self, stanza, *args): """ 查看自己的详细信息 """ self.whois(stanza, Logics.get_one(stanza.from_jid).nick)
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)
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)
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]
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
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