1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#!/usr/bin/python
# Yves Fischer, xapek.org 2009
import sys
from icq import ExtendedBOSConnection, ReconnectOscarFactory
from random import randint
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)
|