#!/usr/bin/python # Yves Fischer, xapek.org 2009 import sys from icq import ExtendedBOSConnection, ReconnectOscarFactory from random import randint from twisted.python import log from twisted.internet import reactor class Member(object): def __init__(self,id,name): self.id = id self.name = name class Room(object): def __init__(self): self.members = [] self.msg_cbs = [] def addMessageCallback(self,cb): self.msg_cbs.append(cb) def removeMessageCallback(self,cb): self.msg_cbs.remove(cb) def join(self,member): self.members.append(member) def leave(self,member): self.members.remove(member) def getMemberById(self,id): l=filter(lambda member: member.id == id, self.members) if len(l) > 0: return l[0] else: return None instance = None @classmethod def getInstance(klass): if klass.instance == None: klass.instance = Room() return klass.instance CAP_TYPING = '\x56\x3f\xc8\x09\x0b\x6f\x41\xbd\x9f\x79\x42\x26\x09\xdf\xa2\xf3' class ICQRoombot( ExtendedBOSConnection ): def initDone( self ): ExtendedBOSConnection.initDone(self) self.room = Room.getInstance() self.members = dict() def receiveCleanMessage( self, user, message, flags ): print "receiveCleanMessage" try: if self.room.getMemberById(user.name) != None: member = self.room.getMemberById(user.name) if message.strip() == "/leave": self.room.leave(member) self.sendMessage(user.name, 'You left') for otherMember in self.room.members: self.sendMessage(otherMember.id, "===== %s/%s left"%(member.name,member.id) ) elif message.strip().startswith("/invite"): otherUin = message.strip().split("/invite")[1].strip() self.sendMessage(otherUin, "Youre invited by %s to join this room!, Type \" /join nickname\""%(user.name)) self.sendMessage(member.id, "Invitation sent to %s"%otherUin) elif message.strip().startswith("/nick"): newNick = message.strip().split("/nick")[1] for otherMember in self.room.members: self.sendMessage(otherMember.id, "===== %s now known as %s" % (member.name,newNick)) member.name = newNick elif message.strip().startswith("/msg"): otherNick = message.strip().split("/msg")[1].strip().split(" ")[0] otherMember = filter(lambda m: m.name == otherNick, self.room.members) if len(otherMember) == 0: self.sendMessage(member.id, "===== Nick %s gibts nicht!" % otherNick) else: self.sendMessage(otherMember[0].id, "=== Privat von %s/%s: %s" % (member.name,member.id,message)) elif message.strip() == "/list": self.sendMessage(member.id, "===== List: %s"%", ".join(map(lambda m: "%s/%s"%(m.id,m.name),self.room.members)) ) elif message.strip().startswith("/"): self.sendMessage(member.id, "===== kennich nicht") else: i=0 for otherMember in self.room.members: i += 1 if otherMember.id == user.name: continue reactor.callLater(i, self.sendMessage, otherMember.id, "%s: %s" %(member.name, message.strip())) else: if message.strip().startswith("/join"): nick = message.strip().split("/join")[1].strip() member = Member(user.name, nick) self.room.join(member) i=0 for otherMember in self.room.members: i += 1 reactor.callLater(i, self.sendMessage, otherMember.id, "===== %s/%s joined" % (member.name,member.id)) else: if randint(0,5) == 3: self.sendMessage(user.name, "Use '/join Nickname' or ' /join Nickname'") self.sendAuthorizationResponse(user.name, True, '') except Exception,e: print "error: %s %s\n%s" % (user,multiparts,e) if __name__ == '__main__': uin = '370496181' password = 'megahal123' host, port = ('login.oscar.aol.com', 5190) import logging logging.basicConfig(level=logging.INFO) log.startLogging(sys.stdout) fac = ReconnectOscarFactory(ICQRoombot, uin, password, icq=1) reactor.connectTCP(host, port, fac) reactor.run()