|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing the IRC data structures and their manager. |
|
8 """ |
|
9 |
|
10 from PyQt4.QtCore import pyqtSignal, QObject |
|
11 |
|
12 import Utilities |
|
13 from Utilities.AutoSaver import AutoSaver |
|
14 from Utilities.crypto import pwConvert |
|
15 import Preferences |
|
16 |
|
17 |
|
18 class IrcIdentity(QObject): |
|
19 """ |
|
20 Class implementing the IRC identity object. |
|
21 """ |
|
22 def __init__(self, name, parent=None): |
|
23 """ |
|
24 Constructor |
|
25 |
|
26 @param name name of the identity (string) |
|
27 @param parent reference to the parent object (QObject) |
|
28 """ |
|
29 super().__init__(parent) |
|
30 |
|
31 self.__name = name |
|
32 self.__realName = "" |
|
33 self.__nickNames = [] |
|
34 self.__serviceName = "" |
|
35 self.__password = "" |
|
36 |
|
37 def save(self, settings): |
|
38 """ |
|
39 Public method to save the identity data. |
|
40 |
|
41 @param settings reference to the settings object (QSettings) |
|
42 """ |
|
43 # no need to save the name because that is the group key |
|
44 settings.setValue("RealName", self.__realName) |
|
45 settings.setValue("NickNames", self.__nickNames) |
|
46 settings.setValue("ServiceName", self.__serviceName) |
|
47 settings.setValue("Password", self.__password) |
|
48 |
|
49 def load(self, settings): |
|
50 """ |
|
51 Public method to load the identity data. |
|
52 |
|
53 @param settings reference to the settings object (QSettings) |
|
54 """ |
|
55 self.__realName = settings.value("RealName", "") |
|
56 self.__nickNames = Preferences.toList(settings.value("NickNames"), []) |
|
57 self.__serviceName = settings.value("ServiceName", "") |
|
58 self.__password = settings.value("Password", "") |
|
59 |
|
60 def getName(self): |
|
61 """ |
|
62 Public method to get the identity name. |
|
63 |
|
64 @return identity name (string) |
|
65 """ |
|
66 return self.__name |
|
67 |
|
68 def setRealName(self, name): |
|
69 """ |
|
70 Public method to set the real name of the identity. |
|
71 |
|
72 @param name real name (string) |
|
73 """ |
|
74 self.__realName = name |
|
75 |
|
76 def getRealName(self): |
|
77 """ |
|
78 Public method to get the real name. |
|
79 |
|
80 @return real name (string) |
|
81 """ |
|
82 return self.__realName |
|
83 |
|
84 def setNickNames(self, names): |
|
85 """ |
|
86 Public method to set the nick names of the identity. |
|
87 |
|
88 @param name nick names (list of string) |
|
89 """ |
|
90 self.__nickNames = names[:] |
|
91 |
|
92 def getNickNames(self): |
|
93 """ |
|
94 Public method to get the nick names. |
|
95 |
|
96 @return nick names (list of string) |
|
97 """ |
|
98 return self.__nickNames |
|
99 |
|
100 def setServiceName(self, name): |
|
101 """ |
|
102 Public method to set the service name of the identity used for identification. |
|
103 |
|
104 @param name service name (string) |
|
105 """ |
|
106 self.__serviceName = name |
|
107 |
|
108 def getServiceName(self): |
|
109 """ |
|
110 Public method to get the service name of the identity used for identification. |
|
111 |
|
112 @return service name (string) |
|
113 """ |
|
114 return self.__serviceName |
|
115 |
|
116 def setPassword(self, password): |
|
117 """ |
|
118 Public method to set a new password. |
|
119 |
|
120 @param password password to set (string) |
|
121 """ |
|
122 self.__password = pwConvert(password, encode=True) |
|
123 |
|
124 def getPassword(self): |
|
125 """ |
|
126 Public method to get the password. |
|
127 |
|
128 @return password (string) |
|
129 """ |
|
130 return pwConvert(self.__password, encode=False) |
|
131 |
|
132 |
|
133 class IrcServer(QObject): |
|
134 """ |
|
135 Class implementing the IRC identity object. |
|
136 """ |
|
137 DefaultPort = 6667 |
|
138 |
|
139 def __init__(self, name, parent=None): |
|
140 """ |
|
141 Constructor |
|
142 |
|
143 @param name name of the server (string) |
|
144 @param parent reference to the parent object (QObject) |
|
145 """ |
|
146 super().__init__(parent) |
|
147 |
|
148 self.__server = name |
|
149 self.__port = IrcServer.DefaultPort |
|
150 self.__ssl = False |
|
151 self.__password = "" |
|
152 |
|
153 def save(self, settings): |
|
154 """ |
|
155 Public method to save the server data. |
|
156 |
|
157 @param settings reference to the settings object (QSettings) |
|
158 """ |
|
159 # no need to save the server name because that is the group key |
|
160 settings.setValue("Port", self.__port) |
|
161 settings.setValue("SSL", self.__ssl) |
|
162 settings.setValue("Password", self.__password) |
|
163 |
|
164 def load(self, settings): |
|
165 """ |
|
166 Public method to load the server data. |
|
167 |
|
168 @param settings reference to the settings object (QSettings) |
|
169 """ |
|
170 self.__port = int(settings.value("Port", IrcServer.DefaultPort)) |
|
171 self.__ssl = Preferences.toBool(settings.value("SSL", False)) |
|
172 self.__password = settings.value("Password", "") |
|
173 |
|
174 def getServer(self): |
|
175 """ |
|
176 Public method to get the server name. |
|
177 |
|
178 @return server name (string) |
|
179 """ |
|
180 return self.__server |
|
181 |
|
182 def getPort(self): |
|
183 """ |
|
184 Public method to get the server port number. |
|
185 |
|
186 @return port number (integer) |
|
187 """ |
|
188 return self.__port |
|
189 |
|
190 def setPort(self, port): |
|
191 """ |
|
192 Public method to set the server port number. |
|
193 |
|
194 @param server port number (integer) |
|
195 """ |
|
196 self.__port = port |
|
197 |
|
198 def useSSL(self): |
|
199 """ |
|
200 Public method to check for SSL usage. |
|
201 |
|
202 @return flag indicating SSL usage (boolean) |
|
203 """ |
|
204 return self.__ssl |
|
205 |
|
206 def setUseSSL(self, on): |
|
207 """ |
|
208 Public method to set the SSL usage. |
|
209 |
|
210 @param on flag indicating SSL usage (boolean) |
|
211 """ |
|
212 self.__ssl = on |
|
213 |
|
214 def setPassword(self, password): |
|
215 """ |
|
216 Public method to set a new password. |
|
217 |
|
218 @param password password to set (string) |
|
219 """ |
|
220 self.__password = pwConvert(password, encode=True) |
|
221 |
|
222 def getPassword(self): |
|
223 """ |
|
224 Public method to get the password. |
|
225 |
|
226 @return password (string) |
|
227 """ |
|
228 return pwConvert(self.__password, encode=False) |
|
229 |
|
230 |
|
231 class IrcNetwork(QObject): |
|
232 """ |
|
233 Class implementing the IRC identity object. |
|
234 """ |
|
235 def __init__(self, name, parent=None): |
|
236 """ |
|
237 Constructor |
|
238 |
|
239 @param name name of the network (string) |
|
240 @param parent reference to the parent object (QObject) |
|
241 """ |
|
242 super().__init__(parent) |
|
243 |
|
244 self.__name = name |
|
245 self.__identity = "" |
|
246 self.__server = "" |
|
247 self.__channels = [] |
|
248 self.__autoJoinChannels = False |
|
249 |
|
250 def save(self, settings): |
|
251 """ |
|
252 Public method to save the network data. |
|
253 |
|
254 @param settings reference to the settings object (QSettings) |
|
255 """ |
|
256 # no need to save the network name because that is the group key |
|
257 settings.setValue("Identity", self.__identity) |
|
258 settings.setValue("Server", self.__server) |
|
259 settings.setValue("Channels", self.__channels) |
|
260 settings.setValue("AutoJoinChannels", self.__autoJoinChannels) |
|
261 |
|
262 def load(self, settings): |
|
263 """ |
|
264 Public method to load the network data. |
|
265 |
|
266 @param settings reference to the settings object (QSettings) |
|
267 """ |
|
268 self.__identity = settings.value("Identity", "") |
|
269 self.__server = settings.value("Server", "") |
|
270 self.__channels = Preferences.toList(settings.value("Channels", [])) |
|
271 self.__autoJoinChannels = Preferences.toBool( |
|
272 settings.value("AutoJoinChannels", False)) |
|
273 |
|
274 def getName(self): |
|
275 """ |
|
276 Public method to get the network name. |
|
277 |
|
278 @return network name (string) |
|
279 """ |
|
280 return self.__name |
|
281 |
|
282 def setIdentityName(self, name): |
|
283 """ |
|
284 Public method to set the name of the identity. |
|
285 |
|
286 @param name identity name (string) |
|
287 """ |
|
288 self.__identity = name |
|
289 |
|
290 def getIdentityName(self): |
|
291 """ |
|
292 Public method to get the name of the identity. |
|
293 |
|
294 @return identity name (string) |
|
295 """ |
|
296 return self.__identity |
|
297 |
|
298 def setServerName(self, name): |
|
299 """ |
|
300 Public method to set the server name. |
|
301 |
|
302 @param name server name (string) |
|
303 """ |
|
304 self.__server = name |
|
305 |
|
306 def getServerName(self): |
|
307 """ |
|
308 Public method to get the server name. |
|
309 |
|
310 @return server name (string) |
|
311 """ |
|
312 return self.__server |
|
313 |
|
314 def setChannels(self, channels): |
|
315 """ |
|
316 Public method to set the list of channels. |
|
317 |
|
318 @param channels list of channels (list of string) |
|
319 """ |
|
320 self.__channels = channels[:] |
|
321 |
|
322 def getChannels(self): |
|
323 """ |
|
324 Public method to get the list of channels. |
|
325 |
|
326 @return list of channels (list of string) |
|
327 """ |
|
328 return self.__channels[:] |
|
329 |
|
330 def setAutoJoinChannels(self, on): |
|
331 """ |
|
332 Public method to enable channel auto joining. |
|
333 |
|
334 @param on flag indicating to join the channels after connecting |
|
335 to the server (boolean) |
|
336 """ |
|
337 self.__autoJoinChannels = on |
|
338 |
|
339 def autoJoinChannels(self): |
|
340 """ |
|
341 Public method to check, if channel auto joining is enabled. |
|
342 |
|
343 @return flag indicating to join the channels after connecting |
|
344 to the server (boolean) |
|
345 """ |
|
346 return self.__autoJoinChannels |
|
347 |
|
348 |
|
349 class IrcNetworkManager(QObject): |
|
350 """ |
|
351 Class implementing the IRC identity object. |
|
352 """ |
|
353 dataChanged = pyqtSignal() |
|
354 |
|
355 def __init__(self, parent=None): |
|
356 """ |
|
357 Constructor |
|
358 |
|
359 @param parent reference to the parent object (QObject) |
|
360 """ |
|
361 super().__init__(parent) |
|
362 |
|
363 self.__loaded = False |
|
364 self.__saveTimer = AutoSaver(self, self.save) |
|
365 |
|
366 self.__settings = Preferences.Prefs.settings |
|
367 |
|
368 self.__networks = {} |
|
369 self.__identities = {} |
|
370 self.__servers = {} |
|
371 |
|
372 self.dataChanged.connect(self.__saveTimer.changeOccurred) |
|
373 |
|
374 def close(self): |
|
375 """ |
|
376 Public method to close the open search engines manager. |
|
377 """ |
|
378 self.__saveTimer.saveIfNeccessary() |
|
379 |
|
380 def save(self): |
|
381 """ |
|
382 Public slot to save the IRC data. |
|
383 """ |
|
384 if not self.__loaded: |
|
385 return |
|
386 |
|
387 # save IRC data |
|
388 self.__settings.beginGroup("IRC") |
|
389 |
|
390 # identities |
|
391 self.__settings.beginGroup("Identities") |
|
392 for key in self.__identities: |
|
393 self.__settings.beginGroup(key) |
|
394 self.__identities[key].save(self.__settings) |
|
395 self.__settings.endGroup() |
|
396 self.__settings.endGroup() |
|
397 |
|
398 # servers |
|
399 self.__settings.beginGroup("Servers") |
|
400 for key in self.__servers: |
|
401 self.__settings.beginGroup(key) |
|
402 self.__servers[key].save(self.__settings) |
|
403 self.__settings.endGroup() |
|
404 self.__settings.endGroup() |
|
405 |
|
406 # networks |
|
407 self.__settings.beginGroup("Networks") |
|
408 for key in self.__networks: |
|
409 self.__settings.beginGroup(key) |
|
410 self.__networks[key].save(self.__settings) |
|
411 self.__settings.endGroup() |
|
412 self.__settings.endGroup() |
|
413 |
|
414 self.__settings.endGroup() |
|
415 |
|
416 def __load(self): |
|
417 """ |
|
418 Private slot to load the IRC data. |
|
419 """ |
|
420 if self.__loaded: |
|
421 return |
|
422 |
|
423 # load IRC data |
|
424 self.__settings.beginGroup("IRC") |
|
425 |
|
426 # identities |
|
427 self.__settings.beginGroup("Identities") |
|
428 for key in self.__settings.childKeys(): |
|
429 self.__identities[key] = IrcIdentity(key, self) |
|
430 self.__settings.beginGroup(key) |
|
431 self.__identities[key].load(self.__settings) |
|
432 self.__settings.endGroup() |
|
433 self.__settings.endGroup() |
|
434 |
|
435 # servers |
|
436 self.__settings.beginGroup("Servers") |
|
437 for key in self.__settings.childKeys(): |
|
438 self.__servers[key] = IrcServer(key, self) |
|
439 self.__settings.beginGroup(key) |
|
440 self.__servers[key].load(self.__settings) |
|
441 self.__settings.endGroup() |
|
442 self.__settings.endGroup() |
|
443 |
|
444 # networks |
|
445 self.__settings.beginGroup("Networks") |
|
446 for key in self.__settings.childKeys(): |
|
447 self.__networks[key] = IrcNetwork(key, self) |
|
448 self.__settings.beginGroup(key) |
|
449 self.__networks[key].load(self.__settings) |
|
450 self.__settings.endGroup() |
|
451 self.__settings.endGroup() |
|
452 |
|
453 self.__settings.endGroup() |
|
454 |
|
455 if not self.__identities or \ |
|
456 not self.__servers or \ |
|
457 not self.__networks: |
|
458 # data structures got corrupted; load defaults |
|
459 self.__loadDefaults() |
|
460 |
|
461 self.__loaded = True |
|
462 |
|
463 def __loadDefaults(self): |
|
464 """ |
|
465 Private method to load default values. |
|
466 """ |
|
467 self.__networks = {} |
|
468 self.__identities = {} |
|
469 self.__servers = {} |
|
470 |
|
471 # identity |
|
472 userName = Utilities.getUserName() |
|
473 identity = IrcIdentity(userName, self) |
|
474 identity.setNickNames([userName, userName + "_", userName + "__"]) |
|
475 self.__identities[userName] = identity |
|
476 |
|
477 # server |
|
478 serverName = "chat.freenode.net" |
|
479 server = IrcServer(serverName, self) |
|
480 server.setPort(8001) |
|
481 self.__servers[serverName] = server |
|
482 |
|
483 # network |
|
484 networkName = "Freenode" |
|
485 network = IrcNetwork(networkName, self) |
|
486 network.setIdentityName(userName) |
|
487 network.setServerName(serverName) |
|
488 network.setChannels(["#eric-ide"]) |
|
489 self.__networks[networkName] = network |
|
490 |
|
491 self.dataChanged.emit() |
|
492 |
|
493 def getIdentity(self, name, create=False): |
|
494 """ |
|
495 Public method to get an identity object. |
|
496 |
|
497 @param name name of the identity to get (string) |
|
498 @param create flag indicating to create a new object, |
|
499 if none exists (boolean) |
|
500 @return reference to the identity (IrcIdentity) |
|
501 """ |
|
502 if not name: |
|
503 return None |
|
504 |
|
505 if not self.__loaded: |
|
506 self.__load() |
|
507 |
|
508 if name in self.__identities: |
|
509 return self.__identities[name] |
|
510 elif create: |
|
511 id = IrcIdentity(name, self) |
|
512 self.__identities[name] = id |
|
513 |
|
514 self.dataChanged.emit() |
|
515 |
|
516 return id |
|
517 else: |
|
518 return None |
|
519 |
|
520 def identityChanged(self): |
|
521 """ |
|
522 Public method to indicate a change of an identity object. |
|
523 """ |
|
524 self.dataChanged.emit() |
|
525 |
|
526 def getServer(self, name, create=False): |
|
527 """ |
|
528 Public method to get a server object. |
|
529 |
|
530 @param name name of the server to get (string) |
|
531 @param create flag indicating to create a new object, |
|
532 if none exists (boolean) |
|
533 @return reference to the server (IrcServer) |
|
534 """ |
|
535 if not name: |
|
536 return None |
|
537 |
|
538 if not self.__loaded: |
|
539 self.__load() |
|
540 |
|
541 if name in self.__servers: |
|
542 return self.__servers[name] |
|
543 elif create: |
|
544 server = IrcServer(name, self) |
|
545 self.__servers[name] = server |
|
546 |
|
547 self.dataChanged.emit() |
|
548 |
|
549 return server |
|
550 else: |
|
551 return None |
|
552 |
|
553 def serverChanged(self): |
|
554 """ |
|
555 Public method to indicate a change of a server object. |
|
556 """ |
|
557 self.dataChanged.emit() |
|
558 |
|
559 def getNetwork(self, name): |
|
560 """ |
|
561 Public method to get a network object. |
|
562 |
|
563 @param name name of the network (string) |
|
564 @return reference to the network object (IrcNetwork) |
|
565 """ |
|
566 if not self.__loaded: |
|
567 self.__load() |
|
568 |
|
569 if name in self.__networks: |
|
570 return self.__networks[name] |
|
571 else: |
|
572 return None |
|
573 |
|
574 def createNetwork(self, name, identity, server, channels=None, |
|
575 autoJoinChannels=False): |
|
576 """ |
|
577 Public method to create a new network object. |
|
578 |
|
579 @param name name of the network (string) |
|
580 @param identity reference to an identity object to associate with |
|
581 this network (IrcIdentity) |
|
582 @param server reference to a server object to associate with this |
|
583 network (IrcServer) |
|
584 @param channels list of channels for the network (list of string) |
|
585 @param autoJoinChannels flag indicating to join the channels |
|
586 automatically (boolean) |
|
587 @return reference to the created network object (IrcNetwork) |
|
588 """ |
|
589 if not self.__loaded: |
|
590 self.__load() |
|
591 |
|
592 if name in self.__networks: |
|
593 return None |
|
594 |
|
595 network = IrcNetwork(name) |
|
596 network.setIdentityName(identity.getName()) |
|
597 network.setServerName(server.getServer()) |
|
598 network.setChannels(channels[:]) |
|
599 network.setAutoJoinChannels(autoJoinChannels) |
|
600 self.__networks[name] = network |
|
601 |
|
602 self.networkChanged() |
|
603 |
|
604 return network |
|
605 |
|
606 def networkChanged(self): |
|
607 """ |
|
608 Public method to indicate a change of a network object. |
|
609 """ |
|
610 self.dataChanged.emit() |
|
611 |
|
612 def getNetworkNames(self): |
|
613 """ |
|
614 Public method to get a list of all known network names. |
|
615 |
|
616 @return list of network names (list of string) |
|
617 """ |
|
618 if not self.__loaded: |
|
619 self.__load() |
|
620 |
|
621 return sorted(self.__networks.keys()) |