hybridbot/hybridbot.py

243 lines
7.1 KiB
Python
Raw Normal View History

2016-07-25 18:01:51 +00:00
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import sys
sys.path.append('lib')
import time
2016-07-28 18:14:33 +00:00
import sleekxmpp
2016-07-25 18:01:51 +00:00
from ircbot import SingleServerIRCBot
from ircbot import Channel
from irclib import nm_to_n
from threading import Thread
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() + '_'
2016-07-25 18:01:51 +00:00
c.nick(self.nickname)
def on_welcome(self, c, e):
print 'Connected to IRC'
2016-07-25 18:01:51 +00:00
c.join(self.channel)
def on_pubmsg(self, c, e):
from_nick = nm_to_n(e.source())
if str(e.arguments()[0]) == '.users':
2016-07-25 18:01:51 +00:00
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].encode('latin-1', 'replace'))
elif str(e.arguments()[0]) == '.help':
m = 'The only command I know is \'.users\'. Also, my owner is ' \
+ owner + '.'
2016-07-25 18:01:51 +00:00
buffer = 460
for i in range(0, len(m), buffer):
inter.irc(m[i:i + buffer].encode('latin-1', 'replace'))
else:
message = '[' + from_nick + '] ' + ''.join(e.arguments())
2016-07-25 18:01:51 +00:00
try:
2016-07-28 18:14:33 +00:00
inter.xmpp(message)
2016-07-25 18:01:51 +00:00
except:
pass
2016-07-28 18:14:33 +00:00
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)
2016-07-25 18:01:51 +00:00
self.remotejid = remotejid
self.chanmuc = chanmuc
def register_handlers(self):
2016-07-28 18:14:33 +00:00
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):
2016-07-25 18:01:51 +00:00
try:
2016-07-28 18:14:33 +00:00
text = event['body']
fromjid = event['from'].bare
nick = event['mucnick']
2016-07-25 18:01:51 +00:00
2016-07-28 18:14:33 +00:00
text = text.replace('\r', '').replace('\n', '')
2016-07-25 18:01:51 +00:00
2016-07-28 18:14:33 +00:00
if text and nick != m_nick:
if text == '.users':
users = self.chanmuc.chan_users()
users = ', '.join(users)
2016-07-28 18:14:33 +00:00
if users:
users = '[ IRC Users ] ' + users
2016-07-25 18:01:51 +00:00
2016-07-28 18:14:33 +00:00
self.jabber.send_message(mto=muc, mbody=users,
mtype='groupchat')
2016-07-25 18:01:51 +00:00
2016-07-28 18:14:33 +00:00
elif text == '.help':
message = 'The only command I have is \'.users\''+ \
'. Also, my owner is ' + owner + '.'
2016-07-25 18:01:51 +00:00
2016-07-28 18:14:33 +00:00
self.jabber.send_message(mto=muc, mbody=message,
mtype='groupchat')
2016-07-25 18:01:51 +00:00
2016-07-28 18:14:33 +00:00
else:
text = '[' + nick + '] ' + text
2016-07-25 18:01:51 +00:00
2016-07-28 18:14:33 +00:00
buffer = 460
for i in range(0, len(text), buffer):
inter.irc(text[i:i + buffer].encode('latin-1',
'replace'))
2016-07-25 18:01:51 +00:00
except Exception as e:
print e
pass
2016-07-28 18:14:33 +00:00
def xmpp_presence(self, event):
2016-07-25 18:01:51 +00:00
try:
2016-07-28 18:14:33 +00:00
type = event['muc']['type']
nick = event['muc']['nick']
2016-07-25 18:01:51 +00:00
if type == 'unavailable':
2016-07-28 18:14:33 +00:00
if nick in self.chanmuc.muc_users():
2016-07-25 18:01:51 +00:00
self.chanmuc.muc_remove_user(n)
else:
2016-07-28 18:14:33 +00:00
if nick not in self.chanmuc.muc_users():
self.chanmuc.muc_add_user(nick.decode())
2016-07-25 18:01:51 +00:00
except Exception as e:
print e
pass
2016-07-28 18:14:33 +00:00
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')
2016-07-25 18:01:51 +00:00
sys.stderr.write('Could not connect to server, or password '
2016-07-28 18:14:33 +00:00
'mismatch!\n')
2016-07-25 18:01:51 +00:00
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:
2016-07-28 18:14:33 +00:00
xmppbot.jabber.send_message(mto=muc, mbody=m, mtype='groupchat')
2016-07-25 18:01:51 +00:00
except:
pass
def irc(self, m):
try:
ircb0t.connection.privmsg(channel, m)
except:
pass
if __name__ == '__main__':
2016-07-25 18:01:51 +00:00
global xmppbot, ircb0t, muc, channel, inter, jid, password, m_nick, owner
2016-07-25 18:01:51 +00:00
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')
2016-07-25 18:01:51 +00:00
chanmuc = ChannelAndMuc()
try:
ircb0t = IRCBot(channel, i_nick, server, port, chanmuc)
2016-07-28 18:14:33 +00:00
xmppbot = XMPPBot(muc, chanmuc)
2016-07-25 18:01:51 +00:00
inter = Intermedia()
z = Thread(target=ircb0t.start, args=())
2016-07-28 18:14:33 +00:00
w = Thread(target=xmppbot.start, args=())
z.daemon = True
w.daemon = True
2016-07-25 18:01:51 +00:00
z.start()
time.sleep(1)
w.start()
z.join()
w.join()
2016-07-28 18:14:33 +00:00
except (KeyboardInterrupt, SystemExit):
print 'Exit'