Network/IRC/IrcNetworkManager.py

changeset 2227
b7aceb255831
child 2231
241df9311ade
equal deleted inserted replaced
2225:0139003972cd 2227:b7aceb255831
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())

eric ide

mercurial