diff --git a/hybridbot.py b/hybridbot.py index b05e8cf..3d1df1a 100755 --- a/hybridbot.py +++ b/hybridbot.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python # -*- coding: utf-8 -*- import sys @@ -9,7 +9,10 @@ from ircbot import SingleServerIRCBot from ircbot import Channel from irclib import nm_to_n from threading import Thread -from ConfigParser import SafeConfigParser +if sys.version_info >= (3, 0): + from configparser import SafeConfigParser +else: + from ConfigParser import SafeConfigParser class IRCBot(SingleServerIRCBot): @@ -43,7 +46,7 @@ class IRCBot(SingleServerIRCBot): c.nick(self.nickname) def on_welcome(self, c, e): - print 'Connected to IRC' + print('Connected to IRC') c.join(self.channel) def on_pubmsg(self, c, e): @@ -56,7 +59,7 @@ class IRCBot(SingleServerIRCBot): buffer = 460 for i in range(0, len(m), buffer): - inter.irc(m[i:i + buffer].encode('latin-1', 'replace')) + inter.irc(m[i:i + buffer]) elif str(e.arguments()[0]) == '.help': m = 'The only command I know is \'.users\'. Also, my owner is ' \ @@ -64,7 +67,7 @@ class IRCBot(SingleServerIRCBot): buffer = 460 for i in range(0, len(m), buffer): - inter.irc(m[i:i + buffer].encode('latin-1', 'replace')) + inter.irc(m[i:i + buffer]) else: message = '[' + from_nick + '] ' + ''.join(e.arguments()) @@ -127,12 +130,10 @@ class XMPPBot(sleekxmpp.ClientXMPP): buffer = 460 for i in range(0, len(text), buffer): - inter.irc(text[i:i + buffer].encode('latin-1', - 'replace')) + inter.irc(text[i:i + buffer]) except Exception as e: - print e - pass + print(e) def xmpp_presence(self, event): try: @@ -145,17 +146,16 @@ class XMPPBot(sleekxmpp.ClientXMPP): else: if nick not in self.chanmuc.muc_users(): - self.chanmuc.muc_add_user(nick.decode()) + self.chanmuc.muc_add_user(nick) except Exception as e: - print e - pass + 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' + print('Connected to XMPP') self.register_handlers() self.jabber.process(block=True) else: @@ -239,4 +239,4 @@ if __name__ == '__main__': z.join() w.join() except (KeyboardInterrupt, SystemExit): - print 'Exit' + print('Exit') diff --git a/lib/ircbot.py b/lib/ircbot.py index ad47981..46a8c67 100644 --- a/lib/ircbot.py +++ b/lib/ircbot.py @@ -25,7 +25,10 @@ write simpler bots. """ import sys -from UserDict import UserDict +if sys.version_info >= (3, 0): + from collections import UserDict +else: + from UserDict import UserDict from irclib import SimpleIRCClient from irclib import nm_to_n, irc_lower, all_events @@ -160,7 +163,7 @@ class SingleServerIRCBot(SimpleIRCClient): """[Internal]""" before = nm_to_n(e.source()) after = e.target() - for ch in self.channels.values(): + for ch in list(self.channels.values()): if ch.has_user(before): ch.change_nick(before, after) @@ -177,7 +180,7 @@ class SingleServerIRCBot(SimpleIRCClient): def _on_quit(self, c, e): """[Internal]""" nick = nm_to_n(e.source()) - for ch in self.channels.values(): + for ch in list(self.channels.values()): if ch.has_user(nick): ch.remove_user(nick) @@ -284,7 +287,7 @@ class IRCDict: def __iter__(self): return iter(self.data) def __contains__(self, key): - return self.has_key(key) + return key in self def clear(self): self.data.clear() self.canon_keys.clear() @@ -294,15 +297,15 @@ class IRCDict: import copy return copy.copy(self) def keys(self): - return self.data.keys() + return list(self.data.keys()) def items(self): - return self.data.items() + return list(self.data.items()) def values(self): - return self.data.values() + return list(self.data.values()) def has_key(self, key): return irc_lower(key) in self.canon_keys def update(self, dict): - for k, v in dict.items(): + for k, v in list(dict.items()): self.data[k] = v def get(self, key, failobj=None): return self.data.get(key, failobj) @@ -322,16 +325,16 @@ class Channel: def users(self): """Returns an unsorted list of the channel's users.""" - return self.userdict.keys() + return list(self.userdict.keys()) def opers(self): """Returns an unsorted list of the channel's operators.""" - return self.operdict.keys() + return list(self.operdict.keys()) def voiced(self): """Returns an unsorted list of the persons that have voice mode set in the channel.""" - return self.voiceddict.keys() + return list(self.voiceddict.keys()) def has_user(self, nick): """Check whether the channel has a user.""" diff --git a/lib/irclib.py b/lib/irclib.py index c072ecc..ab12909 100644 --- a/lib/irclib.py +++ b/lib/irclib.py @@ -207,8 +207,8 @@ class IRC: incoming data, if there are any. If that seems boring, look at the process_forever method. """ - sockets = map(lambda x: x._get_socket(), self.connections) - sockets = filter(lambda x: x != None, sockets) + sockets = [x._get_socket() for x in self.connections] + sockets = [x for x in sockets if x != None] if sockets: (i, o, e) = select.select(sockets, [], [], timeout) self.process_data(i) @@ -344,7 +344,7 @@ class Connection: self.irclibobj = irclibobj def _get_socket(): - raise IRCError, "Not overridden" + raise IRCError("Not overridden") ############################## ### Convenience wrappers. @@ -408,7 +408,7 @@ class ServerConnection(Connection): if self.connected: self.disconnect("Changing servers") - self.previous_buffer = "" + self.previous_buffer = u"" self.handlers = {} self.real_server_name = "" self.real_nickname = nickname @@ -425,10 +425,10 @@ class ServerConnection(Connection): try: self.socket.bind((self.localaddress, self.localport)) self.socket.connect((self.server, self.port)) - except socket.error, x: + except socket.error as x: self.socket.close() self.socket = None - raise ServerConnectionError, "Couldn't connect to socket: %s" % x + raise ServerConnectionError("Couldn't connect to socket: %s" % x) self.connected = 1 if self.irclibobj.fn_to_add_socket: self.irclibobj.fn_to_add_socket(self.socket) @@ -480,7 +480,7 @@ class ServerConnection(Connection): try: new_data = self.socket.recv(2**14) - except socket.error, x: + except socket.error as x: # The server hung up. self.disconnect("Connection reset by peer") return @@ -489,7 +489,7 @@ class ServerConnection(Connection): self.disconnect("Connection reset by peer") return - lines = _linesep_regexp.split(self.previous_buffer + new_data) + lines = _linesep_regexp.split(self.previous_buffer + new_data.decode("latin-1", "replace")) # Save the last, unfinished line. self.previous_buffer = lines[-1] @@ -497,7 +497,7 @@ class ServerConnection(Connection): for line in lines: if DEBUG: - print "FROM SERVER:", line + print("FROM SERVER: %s\n" % line) if not line: continue @@ -551,7 +551,7 @@ class ServerConnection(Connection): command = "privnotice" for m in messages: - if type(m) is types.TupleType: + if type(m) is tuple: if command in ["privmsg", "pubmsg"]: command = "ctcp" else: @@ -559,15 +559,15 @@ class ServerConnection(Connection): m = list(m) if DEBUG: - print "command: %s, source: %s, target: %s, arguments: %s" % ( - command, prefix, target, m) + print("command: %s, source: %s, target: %s, arguments: %s" % ( + command, prefix, target, m)) self._handle_event(Event(command, prefix, target, m)) if command == "ctcp" and m[0] == "ACTION": self._handle_event(Event("action", prefix, target, m[1:])) else: if DEBUG: - print "command: %s, source: %s, target: %s, arguments: %s" % ( - command, prefix, target, [m]) + print("command: %s, source: %s, target: %s, arguments: %s" % ( + command, prefix, target, [m])) self._handle_event(Event(command, prefix, target, [m])) else: target = None @@ -585,8 +585,8 @@ class ServerConnection(Connection): command = "umode" if DEBUG: - print "command: %s, source: %s, target: %s, arguments: %s" % ( - command, prefix, target, arguments) + print("command: %s, source: %s, target: %s, arguments: %s" % ( + command, prefix, target, arguments)) self._handle_event(Event(command, prefix, target, arguments)) def _handle_event(self, event): @@ -650,7 +650,7 @@ class ServerConnection(Connection): try: self.socket.close() - except socket.error, x: + except socket.error as x: pass self.socket = None self._handle_event(Event("disconnect", self.server, "", [message])) @@ -733,7 +733,7 @@ class ServerConnection(Connection): def part(self, channels, message=""): """Send a PART command.""" - if type(channels) == types.StringType: + if type(channels) == bytes: self.send_raw("PART " + channels + (message and (" " + message))) else: self.send_raw("PART " + ",".join(channels) + (message and (" " + message))) @@ -778,12 +778,12 @@ class ServerConnection(Connection): The string will be padded with appropriate CR LF. """ if self.socket is None: - raise ServerNotConnectedError, "Not connected." + raise ServerNotConnectedError("Not connected.") try: - self.socket.send(string + "\r\n") + self.socket.send(string.encode("latin-1", "replace") + b"\r\n") if DEBUG: - print "TO SERVER:", string - except socket.error, x: + print("TO SERVER: %s\n" % string) + except socket.error as x: # Ouch! self.disconnect("Connection reset by peer.") @@ -876,14 +876,14 @@ class DCCConnection(Connection): self.peeraddress = socket.gethostbyname(address) self.peerport = port self.socket = None - self.previous_buffer = "" + self.previous_buffer = u"" self.handlers = {} self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.passive = 0 try: self.socket.connect((self.peeraddress, self.peerport)) - except socket.error, x: - raise DCCConnectionError, "Couldn't connect to socket: %s" % x + except socket.error as x: + raise DCCConnectionError("Couldn't connect to socket: %s" % x) self.connected = 1 if self.irclibobj.fn_to_add_socket: self.irclibobj.fn_to_add_socket(self.socket) @@ -899,7 +899,7 @@ class DCCConnection(Connection): peer, the peer address and port are available as self.peeraddress and self.peerport. """ - self.previous_buffer = "" + self.previous_buffer = u"" self.handlers = {} self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.passive = 1 @@ -907,8 +907,8 @@ class DCCConnection(Connection): self.socket.bind((socket.gethostbyname(socket.gethostname()), 0)) self.localaddress, self.localport = self.socket.getsockname() self.socket.listen(10) - except socket.error, x: - raise DCCConnectionError, "Couldn't bind socket: %s" % x + except socket.error as x: + raise DCCConnectionError("Couldn't bind socket: %s" % x) return self def disconnect(self, message=""): @@ -924,7 +924,7 @@ class DCCConnection(Connection): self.connected = 0 try: self.socket.close() - except socket.error, x: + except socket.error as x: pass self.socket = None self.irclibobj._handle_event( @@ -941,8 +941,8 @@ class DCCConnection(Connection): self.socket = conn self.connected = 1 if DEBUG: - print "DCC connection from %s:%d" % ( - self.peeraddress, self.peerport) + print("DCC connection from %s:%d" % ( + self.peeraddress, self.peerport)) self.irclibobj._handle_event( self, Event("dcc_connect", self.peeraddress, None, None)) @@ -950,7 +950,7 @@ class DCCConnection(Connection): try: new_data = self.socket.recv(2**14) - except socket.error, x: + except socket.error as x: # The server hung up. self.disconnect("Connection reset by peer") return @@ -979,11 +979,11 @@ class DCCConnection(Connection): target = None for chunk in chunks: if DEBUG: - print "FROM PEER:", chunk + print("FROM PEER: %s\n" % chunk) arguments = [chunk] if DEBUG: - print "command: %s, source: %s, target: %s, arguments: %s" % ( - command, prefix, target, arguments) + print("command: %s, source: %s, target: %s, arguments: %s" % ( + command, prefix, target, arguments)) self.irclibobj._handle_event( self, Event(command, prefix, target, arguments)) @@ -1003,8 +1003,8 @@ class DCCConnection(Connection): if self.dcctype == "chat": self.socket.send("\n") if DEBUG: - print "TO PEER: %s\n" % string - except socket.error, x: + print("TO PEER: %s\n" % string) + except socket.error as x: # Ouch! self.disconnect("Connection reset by peer.") @@ -1173,8 +1173,12 @@ def mask_matches(nick, mask): _special = "-[]\\`^{}" nick_characters = string.ascii_letters + string.digits + _special -_ircstring_translation = string.maketrans(string.ascii_uppercase + "[]\\^", - string.ascii_lowercase + "{}|~") +if sys.version_info >= (3, 0): + _ircstring_translation = bytes.maketrans((string.ascii_uppercase + "[]\\^").encode("latin-1"), + (string.ascii_lowercase + "{}|~").encode("latin-1")) +else: + _ircstring_translation = string.maketrans(string.ascii_uppercase + "[]\\^", + string.ascii_lowercase + "{}|~") def irc_lower(s): """Returns a lowercased string. @@ -1249,16 +1253,16 @@ def ip_numstr_to_quad(num): """Convert an IP number as an integer given in ASCII representation (e.g. '3232235521') to an IP address string (e.g. '192.168.0.1').""" - n = long(num) - p = map(str, map(int, [n >> 24 & 0xFF, n >> 16 & 0xFF, - n >> 8 & 0xFF, n & 0xFF])) + n = int(num) + p = list(map(str, list(map(int, [n >> 24 & 0xFF, n >> 16 & 0xFF, + n >> 8 & 0xFF, n & 0xFF])))) return ".".join(p) def ip_quad_to_numstr(quad): """Convert an IP address string (e.g. '192.168.0.1') to an IP number as an integer given in ASCII representation (e.g. '3232235521').""" - p = map(long, quad.split(".")) + p = list(map(int, quad.split("."))) s = str((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]) if s[-1] == "L": s = s[:-1] @@ -1547,4 +1551,4 @@ protocol_events = [ "pong", ] -all_events = generated_events + protocol_events + numeric_events.values() +all_events = generated_events + protocol_events + list(numeric_events.values())