3 ###############################################
5 ###############################################
10 #---------------------------------------------#
12 #---------------------------------------------#
13 def __init__(self
, address
, nick
):
14 self
.address
= address
19 self
.state
= DCPP_CLIENT
.ST_DISCONNECTED
20 self
.sock
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
22 #---------------------------------------------#
24 #---------------------------------------------#
28 #---------------------------------------------#
30 #---------------------------------------------#
32 if self
.is_connected(): return 0 # if already connected
35 self
.sock
.connect(self
.address
)
36 self
.state
= DCPP_CLIENT
.ST_CONNECTED
43 key
= create_key(u
"EXTENDEDPROTOCOL_verlihub").encode("utf-8")
44 self
.send("$Key %s|$ValidateNick %s|" %(key
, self
.nick
))
48 self
.send("$Version 1,0091|$MyINFO $ALL %s desu$ $0$$0$|" %self
.nick
)
52 #---------------------------------------------#
54 #---------------------------------------------#
56 if not self
.is_connected(): return 0 # if already disconnected
59 self
.state
= DCPP_CLIENT
.ST_DISCONNECTED
61 #---------------------------------------------#
63 #---------------------------------------------#
64 def is_connected(self
):
65 return (self
.state
== DCPP_CLIENT
.ST_CONNECTED
)
67 #---------------------------------------------#
69 #---------------------------------------------#
71 if not self
.is_connected(): return "" # if disconnected
73 inputready
, outputready
, exceptready
= select
.select([self
.sock
, ],[], [], 0.5)
76 return self
.sock
.recv(1024)
84 #---------------------------------------------#
86 #---------------------------------------------#
87 def update_cache(self
):
88 self
.cache
+= self
.recv()
90 #---------------------------------------------#
92 #---------------------------------------------#
93 def process_cache(self
):
94 pipepos
= self
.cache
.find("|")
97 data
= self
.cache
[:pipepos
]
98 self
.cache
= self
.cache
[pipepos
+1:]
101 if data
.find("$To:") != -1:
102 p1
= data
.find("From: ") + 6
106 p1
= data
.find("> ") + 2
109 elif data
.find("> ") != -1:
112 p1
= data
.find("> ") + 2
116 return None, None, None
120 return None, None, None
122 #---------------------------------------------#
124 #---------------------------------------------#
125 def send(self
, data
):
126 if not self
.is_connected(): return 0 # if disconnected
132 # TODO: process this!
134 #---------------------------------------------#
136 #---------------------------------------------#
137 def send_to_user(self
, user
, msg
):
140 self
.send("$To: %s From: %s $<%s> %s|" %(user
, self
.nick
, self
.nick
, msg
))
143 self
.send("<%s> %s|" %(self
.nick
, msg
))
145 ###############################################
147 ###############################################
148 def create_key(lock
):
151 for i
in xrange(1, len(lock
)):
152 key
[i
] = ord(lock
[i
]) ^
ord(lock
[i
-1])
154 key
[0] = ord(lock
[0]) ^
ord(lock
[len(lock
)-1]) ^
ord(lock
[len(lock
)-2]) ^
5
156 for i
in xrange(0, len(lock
)):
157 key
[i
] = ((key
[i
]<<4) & 240) |
((key
[i
]>>4) & 15)
160 for i
in xrange(0, len(lock
)):
161 out
+= unichr(key
[i
])
163 out
= out
.replace(u
'\0', u
'/%DCN000%/').replace(u
'\5', u
'/%DCN005%/').replace(u
'\44', u
'/%DCN036%/')
164 out
= out
.replace(u
'\140', u
'/%DCN096%/').replace(u
'\174', u
'/%DCN124%/').replace(u
'\176', u
'/%DCN126%/')