#!/usr/bin/env python # -*- coding: utf-8 -*- import sys sys.path.append('lib') import time import sleekxmpp from ircbot import SingleServerIRCBot from ircbot import Channel from irclib import nm_to_n from threading import Thread if sys.version_info >= (3, 0): from configparser import SafeConfigParser else: from ConfigParser import SafeConfigParser class IRCBot(SingleServerIRCBot): def __init__(self, channel, nickname, server, port, chanmuc): SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname) self.channel = channel self.nickname = nickname self.chanmuc = chanmuc def _on_join(self, c, e): nick = nm_to_n(e.source()) if nick not in self.chanmuc.chan_users(): self.chanmuc.chan_add_user(nick) def _on_namreply(self, c, e): bot = c.get_nickname() for nick in e.arguments()[2].split(): if nick != c.get_nickname(): self.chanmuc.chan_add_user(nick) def _on_part(self, c, e): nick = nm_to_n(e.source()) if nick in self.chanmuc.chan_users(): self.chanmuc.chan_remove_user(nick) def on_nicknameinuse(self, c, e): self.nickname = c.get_nickname() + '_' c.nick(self.nickname) def on_welcome(self, c, e): print('Connected to IRC') c.join(self.channel) def on_pubmsg(self, c, e): from_nick = nm_to_n(e.source()) if str(e.arguments()[0]) == '.users': users = self.chanmuc.muc_users() users = ', '.join(users) m = '[ XMPP Users ] ' + users buffer = 460 for i in range(0, len(m), buffer): inter.irc(m[i:i + buffer]) elif str(e.arguments()[0]) == '.help': m = 'The only command I know is \'.users\'. Also, my owner is ' \ + owner + '.' buffer = 460 for i in range(0, len(m), buffer): inter.irc(m[i:i + buffer]) else: message = '[' + from_nick + '] ' + ''.join(e.arguments()) try: inter.xmpp(message) except: pass class XMPPBot(sleekxmpp.ClientXMPP): def __init__(self, remotejid, chanmuc): if sys.version_info < (3, 0): sleekxmpp.util.misc_ops.setdefaultencoding('utf8') self.jabber = sleekxmpp.ClientXMPP(jid, password) self.remotejid = remotejid self.chanmuc = chanmuc def register_handlers(self): self.jabber.add_event_handler('session_start', self.session_start) self.jabber.add_event_handler('groupchat_message', self.xmpp_message) self.jabber.add_event_handler('muc::%s::presence' % self.remotejid, self.xmpp_presence) def session_start(self, event): self.jabber.get_roster() self.jabber.send_presence() self.jabber.plugin['xep_0045'].joinMUC(self.remotejid, m_nick, wait=True) def xmpp_message(self, event): try: text = event['body'] fromjid = event['from'].bare nick = event['mucnick'] text = text.replace('\r', '').replace('\n', '') if text and nick != m_nick: if text == '.users': users = self.chanmuc.chan_users() users = ', '.join(users) if users: users = '[ IRC Users ] ' + users self.jabber.send_message(mto=muc, mbody=users, mtype='groupchat') elif text == '.help': message = 'The only command I have is \'.users\''+ \ '. Also, my owner is ' + owner + '.' self.jabber.send_message(mto=muc, mbody=message, mtype='groupchat') else: text = '[' + nick + '] ' + text buffer = 460 for i in range(0, len(text), buffer): inter.irc(text[i:i + buffer]) except Exception as e: print(e) def xmpp_presence(self, event): try: type = event['muc']['type'] nick = event['muc']['nick'] if type == 'unavailable': if nick in self.chanmuc.muc_users(): self.chanmuc.muc_remove_user(n) else: if nick not in self.chanmuc.muc_users(): self.chanmuc.muc_add_user(nick) except Exception as e: print(e) def start(self): self.jabber.register_plugin('xep_0045') # XMPP MUC. self.jabber.register_plugin('xep_0199') # XMPP Ping. if self.jabber.connect(): # sys.stderr.write('connected with %s\n'%con) print('Connected to XMPP') self.register_handlers() self.jabber.process(block=True) else: # sys.stderr.write('could not connect!\n') sys.stderr.write('Could not connect to server, or password ' 'mismatch!\n') sys.exit(1) class ChannelAndMuc: def __init__(self): self.m_users = [] self.c_users = [] def muc_add_user(self, user): self.m_users.append(user) def muc_remove_user(self, user): self.m_users.remove(user) def chan_add_user(self, user): self.c_users.append(user) def chan_remove_user(self, user): self.c_users.remove(user) def muc_users(self): return self.m_users def chan_users(self): return self.c_users class Intermedia: def xmpp(self, m): try: xmppbot.jabber.send_message(mto=muc, mbody=m, mtype='groupchat') except: pass def irc(self, m): try: ircb0t.connection.privmsg(channel, m) except: pass if __name__ == '__main__': global xmppbot, ircb0t, muc, channel, inter, jid, password, m_nick, owner parser = SafeConfigParser() if len(sys.argv) > 1: parser.read(sys.argv[1]) else: parser.read('config.ini') jid = parser.get('XMPP', 'jid') password = parser.get('XMPP', 'password') muc = parser.get('XMPP', 'muc') m_nick = parser.get('XMPP', 'nick') channel = str(parser.get('IRC', 'channel')) i_nick = parser.get('IRC', 'nick') server = parser.get('IRC', 'server') port = int(parser.get('IRC', 'port')) owner = parser.get('IRC', 'owner') chanmuc = ChannelAndMuc() try: ircb0t = IRCBot(channel, i_nick, server, port, chanmuc) xmppbot = XMPPBot(muc, chanmuc) inter = Intermedia() z = Thread(target=ircb0t.start, args=()) w = Thread(target=xmppbot.start, args=()) z.daemon = True w.daemon = True z.start() time.sleep(1) w.start() z.join() w.join() except (KeyboardInterrupt, SystemExit): print('Exit')