|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing the IRC data structures and their manager. |
|
8 """ |
|
9 |
|
10 import copy |
|
11 |
|
12 from PyQt6.QtCore import QCoreApplication, QObject, pyqtSignal |
|
13 |
|
14 from eric7 import EricUtilities, Preferences |
|
15 from eric7.EricUtilities.crypto import pwConvert |
|
16 from eric7.SystemUtilities import OSUtilities |
|
17 from eric7.Utilities.AutoSaver import AutoSaver |
|
18 |
|
19 |
|
20 class IrcIdentity: |
|
21 """ |
|
22 Class implementing the IRC identity object. |
|
23 """ |
|
24 |
|
25 DefaultIdentityName = "0default" |
|
26 DefaultIdentityDisplay = QCoreApplication.translate( |
|
27 "IrcIdentity", "Default Identity" |
|
28 ) |
|
29 |
|
30 DefaultAwayMessage = QCoreApplication.translate("IrcIdentity", "Gone away for now.") |
|
31 DefaultQuitMessage = QCoreApplication.translate("IrcIdentity", "IRC for eric IDE") |
|
32 DefaultPartMessage = QCoreApplication.translate("IrcIdentity", "IRC for eric IDE") |
|
33 |
|
34 def __init__(self, name): |
|
35 """ |
|
36 Constructor |
|
37 |
|
38 @param name name of the identity |
|
39 @type str |
|
40 """ |
|
41 super().__init__() |
|
42 |
|
43 self.__name = name |
|
44 self.__realName = "" |
|
45 self.__nickNames = [] |
|
46 self.__serviceName = "" |
|
47 self.__password = "" |
|
48 self.__ident = OSUtilities.getUserName() |
|
49 |
|
50 self.__rememberPosOnAway = True |
|
51 self.__awayMessage = IrcIdentity.DefaultAwayMessage |
|
52 |
|
53 self.__quitMessage = IrcIdentity.DefaultQuitMessage |
|
54 self.__partMessage = IrcIdentity.DefaultPartMessage |
|
55 |
|
56 def save(self, settings): |
|
57 """ |
|
58 Public method to save the identity data. |
|
59 |
|
60 @param settings reference to the settings object |
|
61 @type QSettings |
|
62 """ |
|
63 # no need to save the name because that is the group key |
|
64 settings.setValue("Ident", self.__ident) |
|
65 settings.setValue("RealName", self.__realName) |
|
66 settings.setValue("NickNames", self.__nickNames) |
|
67 settings.setValue("ServiceName", self.__serviceName) |
|
68 settings.setValue("Password", self.__password) |
|
69 settings.setValue("QuitMessage", self.__quitMessage) |
|
70 settings.setValue("PartMessage", self.__partMessage) |
|
71 settings.setValue("RememberAwayPosition", self.__rememberPosOnAway) |
|
72 settings.setValue("AwayMessage", self.__awayMessage) |
|
73 |
|
74 def load(self, settings): |
|
75 """ |
|
76 Public method to load the identity data. |
|
77 |
|
78 @param settings reference to the settings object |
|
79 @type QSettings |
|
80 """ |
|
81 self.__ident = settings.value("Ident", OSUtilities.getUserName()) |
|
82 self.__realName = settings.value("RealName", "") |
|
83 self.__nickNames = EricUtilities.toList(settings.value("NickNames", [])) |
|
84 self.__serviceName = settings.value("ServiceName", "") |
|
85 self.__password = settings.value("Password", "") |
|
86 self.__quitMessage = settings.value( |
|
87 "QuitMessage", IrcIdentity.DefaultQuitMessage |
|
88 ) |
|
89 self.__partMessage = settings.value( |
|
90 "PartMessage", IrcIdentity.DefaultPartMessage |
|
91 ) |
|
92 self.__rememberPosOnAway = EricUtilities.toBool( |
|
93 settings.value("RememberAwayPosition", True) |
|
94 ) |
|
95 self.__awayMessage = settings.value( |
|
96 "AwayMessage", IrcIdentity.DefaultAwayMessage |
|
97 ) |
|
98 |
|
99 def setName(self, name): |
|
100 """ |
|
101 Public method to set the identity name. |
|
102 |
|
103 @param name identity name |
|
104 @type str |
|
105 """ |
|
106 self.__name = name |
|
107 |
|
108 def getName(self): |
|
109 """ |
|
110 Public method to get the identity name. |
|
111 |
|
112 @return identity name |
|
113 @rtype str |
|
114 """ |
|
115 return self.__name |
|
116 |
|
117 def setIdent(self, name): |
|
118 """ |
|
119 Public method to set the real identity name. |
|
120 |
|
121 @param name real identity name |
|
122 @type str |
|
123 """ |
|
124 self.__ident = name |
|
125 |
|
126 def getIdent(self): |
|
127 """ |
|
128 Public method to get the real identity name. |
|
129 |
|
130 @return real identity name |
|
131 @rtype str |
|
132 """ |
|
133 return self.__ident |
|
134 |
|
135 def setRealName(self, name): |
|
136 """ |
|
137 Public method to set the real name of the identity. |
|
138 |
|
139 @param name real name |
|
140 @type str |
|
141 """ |
|
142 self.__realName = name |
|
143 |
|
144 def getRealName(self): |
|
145 """ |
|
146 Public method to get the real name. |
|
147 |
|
148 @return real name |
|
149 @rtype str |
|
150 """ |
|
151 return self.__realName |
|
152 |
|
153 def setNickNames(self, names): |
|
154 """ |
|
155 Public method to set the nick names of the identity. |
|
156 |
|
157 @param names nick names |
|
158 @type list of str |
|
159 """ |
|
160 self.__nickNames = names[:] |
|
161 |
|
162 def getNickNames(self): |
|
163 """ |
|
164 Public method to get the nick names. |
|
165 |
|
166 @return nick names |
|
167 @rtype list of str |
|
168 """ |
|
169 return self.__nickNames |
|
170 |
|
171 def setServiceName(self, name): |
|
172 """ |
|
173 Public method to set the service name of the identity used for |
|
174 identification. |
|
175 |
|
176 @param name service name |
|
177 @type str |
|
178 """ |
|
179 self.__serviceName = name |
|
180 |
|
181 def getServiceName(self): |
|
182 """ |
|
183 Public method to get the service name of the identity used for |
|
184 identification. |
|
185 |
|
186 @return service name |
|
187 @rtype str |
|
188 """ |
|
189 return self.__serviceName |
|
190 |
|
191 def setPassword(self, password): |
|
192 """ |
|
193 Public method to set a new password. |
|
194 |
|
195 @param password password to set |
|
196 @type str |
|
197 """ |
|
198 self.__password = pwConvert(password, encode=True) |
|
199 |
|
200 def getPassword(self): |
|
201 """ |
|
202 Public method to get the password. |
|
203 |
|
204 @return password |
|
205 @rtype str |
|
206 """ |
|
207 return pwConvert(self.__password, encode=False) |
|
208 |
|
209 def setQuitMessage(self, message): |
|
210 """ |
|
211 Public method to set the QUIT message. |
|
212 |
|
213 @param message QUIT message |
|
214 @type str |
|
215 """ |
|
216 if message: |
|
217 self.__quitMessage = message |
|
218 else: |
|
219 self.__quitMessage = IrcIdentity.DefaultQuitMessage |
|
220 |
|
221 def getQuitMessage(self): |
|
222 """ |
|
223 Public method to get the QUIT message. |
|
224 |
|
225 @return QUIT message |
|
226 @rtype str |
|
227 """ |
|
228 return self.__quitMessage |
|
229 |
|
230 def setPartMessage(self, message): |
|
231 """ |
|
232 Public method to set the PART message. |
|
233 |
|
234 @param message PART message |
|
235 @type str |
|
236 """ |
|
237 if message: |
|
238 self.__partMessage = message |
|
239 else: |
|
240 self.__partMessage = IrcIdentity.DefaultPartMessage |
|
241 |
|
242 def getPartMessage(self): |
|
243 """ |
|
244 Public method to get the PART message. |
|
245 |
|
246 @return PART message |
|
247 @rtype str |
|
248 """ |
|
249 return self.__partMessage |
|
250 |
|
251 def setRememberAwayPosition(self, remember): |
|
252 """ |
|
253 Public method to set to remember the chat position upon AWAY. |
|
254 |
|
255 @param remember flag indicating to remember the chat position |
|
256 @type bool |
|
257 """ |
|
258 self.__rememberPosOnAway = remember |
|
259 |
|
260 def rememberAwayPosition(self): |
|
261 """ |
|
262 Public method to get a flag indicating to remember the chat position |
|
263 upon AWAY. |
|
264 |
|
265 @return flag indicating to remember the chat position |
|
266 @rtype bool |
|
267 """ |
|
268 return self.__rememberPosOnAway |
|
269 |
|
270 def setAwayMessage(self, message): |
|
271 """ |
|
272 Public method to set the AWAY message. |
|
273 |
|
274 @param message AWAY message |
|
275 @type str |
|
276 """ |
|
277 if message: |
|
278 self.__awayMessage = message |
|
279 else: |
|
280 self.__awayMessage = IrcIdentity.DefaultAwayMessage |
|
281 |
|
282 def getAwayMessage(self): |
|
283 """ |
|
284 Public method to get the AWAY message. |
|
285 |
|
286 @return AWAY message |
|
287 @rtype str |
|
288 """ |
|
289 return self.__awayMessage |
|
290 |
|
291 @classmethod |
|
292 def createDefaultIdentity(cls): |
|
293 """ |
|
294 Class method to create the default identity. |
|
295 |
|
296 @return default identity |
|
297 @rtype IrcIdentity |
|
298 """ |
|
299 userName = OSUtilities.getUserName() |
|
300 realName = OSUtilities.getRealName() |
|
301 if not realName: |
|
302 realName = "eric IDE chat" |
|
303 identity = IrcIdentity(IrcIdentity.DefaultIdentityName) |
|
304 identity.setNickNames([userName, userName + "_", userName + "__"]) |
|
305 identity.setRealName(realName) |
|
306 identity.setIdent(userName) |
|
307 return identity |
|
308 |
|
309 |
|
310 class IrcServer: |
|
311 """ |
|
312 Class implementing the IRC identity object. |
|
313 """ |
|
314 |
|
315 DefaultPort = 6667 |
|
316 DefaultSslPort = 6697 |
|
317 |
|
318 def __init__(self, name): |
|
319 """ |
|
320 Constructor |
|
321 |
|
322 @param name name of the server |
|
323 @type str |
|
324 """ |
|
325 super().__init__() |
|
326 |
|
327 self.__server = name |
|
328 self.__port = IrcServer.DefaultPort |
|
329 self.__ssl = False |
|
330 self.__password = "" |
|
331 |
|
332 def save(self, settings): |
|
333 """ |
|
334 Public method to save the server data. |
|
335 |
|
336 @param settings reference to the settings object |
|
337 @type QSettings |
|
338 """ |
|
339 settings.setValue("Name", self.__server) |
|
340 settings.setValue("Port", self.__port) |
|
341 settings.setValue("SSL", self.__ssl) |
|
342 settings.setValue("Password", self.__password) |
|
343 |
|
344 def load(self, settings): |
|
345 """ |
|
346 Public method to load the server data. |
|
347 |
|
348 @param settings reference to the settings object |
|
349 @type QSettings |
|
350 """ |
|
351 self.__server = settings.value("Name", "") |
|
352 self.__port = int(settings.value("Port", IrcServer.DefaultPort)) |
|
353 self.__ssl = EricUtilities.toBool(settings.value("SSL", False)) |
|
354 self.__password = settings.value("Password", "") |
|
355 |
|
356 def getName(self): |
|
357 """ |
|
358 Public method to get the server name. |
|
359 |
|
360 @return server name |
|
361 @rtype str |
|
362 """ |
|
363 return self.__server |
|
364 |
|
365 def setName(self, name): |
|
366 """ |
|
367 Public method to set the server name. |
|
368 |
|
369 @param name server name |
|
370 @type str |
|
371 """ |
|
372 self.__server = name |
|
373 |
|
374 def getPort(self): |
|
375 """ |
|
376 Public method to get the server port number. |
|
377 |
|
378 @return port number |
|
379 @rtype int |
|
380 """ |
|
381 return self.__port |
|
382 |
|
383 def setPort(self, port): |
|
384 """ |
|
385 Public method to set the server port number. |
|
386 |
|
387 @param port server port number |
|
388 @type int |
|
389 """ |
|
390 self.__port = port |
|
391 |
|
392 def useSSL(self): |
|
393 """ |
|
394 Public method to check for SSL usage. |
|
395 |
|
396 @return flag indicating SSL usage |
|
397 @rtype bool |
|
398 """ |
|
399 return self.__ssl |
|
400 |
|
401 def setUseSSL(self, on): |
|
402 """ |
|
403 Public method to set the SSL usage. |
|
404 |
|
405 @param on flag indicating SSL usage |
|
406 @type bool |
|
407 """ |
|
408 self.__ssl = on |
|
409 |
|
410 def setPassword(self, password): |
|
411 """ |
|
412 Public method to set a new password. |
|
413 |
|
414 @param password password to set |
|
415 @type str |
|
416 """ |
|
417 self.__password = pwConvert(password, encode=True) |
|
418 |
|
419 def getPassword(self): |
|
420 """ |
|
421 Public method to get the password. |
|
422 |
|
423 @return password |
|
424 @rtype str |
|
425 """ |
|
426 return pwConvert(self.__password, encode=False) |
|
427 |
|
428 |
|
429 class IrcChannel: |
|
430 """ |
|
431 Class implementing the IRC channel object. |
|
432 """ |
|
433 |
|
434 def __init__(self, name): |
|
435 """ |
|
436 Constructor |
|
437 |
|
438 @param name name of the network |
|
439 @type str |
|
440 """ |
|
441 super().__init__() |
|
442 |
|
443 self.__name = name |
|
444 self.__key = "" |
|
445 self.__autoJoin = False |
|
446 |
|
447 def save(self, settings): |
|
448 """ |
|
449 Public method to save the channel data. |
|
450 |
|
451 @param settings reference to the settings object |
|
452 @type QSettings |
|
453 """ |
|
454 # no need to save the channel name because that is the group key |
|
455 settings.setValue("Key", self.__key) |
|
456 settings.setValue("AutoJoin", self.__autoJoin) |
|
457 |
|
458 def load(self, settings): |
|
459 """ |
|
460 Public method to load the network data. |
|
461 |
|
462 @param settings reference to the settings object |
|
463 @type QSettings |
|
464 """ |
|
465 self.__key = settings.value("Key", "") |
|
466 self.__autoJoin = EricUtilities.toBool(settings.value("AutoJoin", False)) |
|
467 |
|
468 def getName(self): |
|
469 """ |
|
470 Public method to get the channel name. |
|
471 |
|
472 @return channel name |
|
473 @rtype str |
|
474 """ |
|
475 return self.__name |
|
476 |
|
477 def setKey(self, key): |
|
478 """ |
|
479 Public method to set a new channel key. |
|
480 |
|
481 @param key channel key to set |
|
482 @type str |
|
483 """ |
|
484 self.__key = pwConvert(key, encode=True) |
|
485 |
|
486 def getKey(self): |
|
487 """ |
|
488 Public method to get the channel key. |
|
489 |
|
490 @return channel key |
|
491 @rtype str |
|
492 """ |
|
493 return pwConvert(self.__key, encode=False) |
|
494 |
|
495 def autoJoin(self): |
|
496 """ |
|
497 Public method to check the auto join status. |
|
498 |
|
499 @return flag indicating if the channel should be |
|
500 joined automatically |
|
501 @rtype bool |
|
502 """ |
|
503 return self.__autoJoin |
|
504 |
|
505 def setAutoJoin(self, enable): |
|
506 """ |
|
507 Public method to set the auto join status of the channel. |
|
508 |
|
509 @param enable flag indicating if the channel should be |
|
510 joined automatically |
|
511 @type bool |
|
512 """ |
|
513 self.__autoJoin = enable |
|
514 |
|
515 |
|
516 class IrcNetwork: |
|
517 """ |
|
518 Class implementing the IRC network object. |
|
519 """ |
|
520 |
|
521 def __init__(self, name): |
|
522 """ |
|
523 Constructor |
|
524 |
|
525 @param name name of the network |
|
526 @type str |
|
527 """ |
|
528 super().__init__() |
|
529 |
|
530 self.__name = name |
|
531 self.__identity = "" |
|
532 self.__server = None |
|
533 self.__channels = {} |
|
534 self.__autoConnect = False |
|
535 |
|
536 def save(self, settings): |
|
537 """ |
|
538 Public method to save the network data. |
|
539 |
|
540 @param settings reference to the settings object |
|
541 @type QSettings |
|
542 """ |
|
543 # no need to save the network name because that is the group key |
|
544 settings.setValue("Identity", self.__identity) |
|
545 settings.setValue("AutoConnect", self.__autoConnect) |
|
546 |
|
547 settings.beginGroup("Server") |
|
548 self.__server.save(settings) |
|
549 settings.endGroup() |
|
550 |
|
551 settings.beginGroup("Channels") |
|
552 for key in self.__channels: |
|
553 settings.beginGroup(key) |
|
554 self.__channels[key].save(settings) |
|
555 settings.endGroup() |
|
556 settings.endGroup() |
|
557 |
|
558 def load(self, settings): |
|
559 """ |
|
560 Public method to load the network data. |
|
561 |
|
562 @param settings reference to the settings object |
|
563 @type QSettings |
|
564 """ |
|
565 self.__identity = settings.value("Identity", "") |
|
566 self.__autoConnect = EricUtilities.toBool(settings.value("AutoConnect", False)) |
|
567 |
|
568 settings.beginGroup("Server") |
|
569 self.__server = IrcServer("") |
|
570 self.__server.load(settings) |
|
571 settings.endGroup() |
|
572 |
|
573 settings.beginGroup("Channels") |
|
574 for key in settings.childGroups(): |
|
575 self.__channels[key] = IrcChannel(key) |
|
576 settings.beginGroup(key) |
|
577 self.__channels[key].load(settings) |
|
578 settings.endGroup() |
|
579 settings.endGroup() |
|
580 |
|
581 def setName(self, name): |
|
582 """ |
|
583 Public method to set the network name. |
|
584 |
|
585 @param name network name |
|
586 @type str |
|
587 """ |
|
588 self.__name = name |
|
589 |
|
590 def getName(self): |
|
591 """ |
|
592 Public method to get the network name. |
|
593 |
|
594 @return network name |
|
595 @rtype str |
|
596 """ |
|
597 return self.__name |
|
598 |
|
599 def setIdentityName(self, name): |
|
600 """ |
|
601 Public method to set the name of the identity. |
|
602 |
|
603 @param name identity name |
|
604 @type str |
|
605 """ |
|
606 self.__identity = name |
|
607 |
|
608 def getIdentityName(self): |
|
609 """ |
|
610 Public method to get the name of the identity. |
|
611 |
|
612 @return identity name |
|
613 @rtype str |
|
614 """ |
|
615 return self.__identity |
|
616 |
|
617 def getServerName(self): |
|
618 """ |
|
619 Public method to get the server name. |
|
620 |
|
621 @return server name |
|
622 @rtype str |
|
623 """ |
|
624 if self.__server: |
|
625 return self.__server.getName() |
|
626 else: |
|
627 return "" |
|
628 |
|
629 def getServer(self): |
|
630 """ |
|
631 Public method to get the server object. |
|
632 |
|
633 @return reference to the server |
|
634 @rtype IrcServer |
|
635 """ |
|
636 return self.__server |
|
637 |
|
638 def setServer(self, server): |
|
639 """ |
|
640 Public method to set the server. |
|
641 |
|
642 @param server server object to set |
|
643 @type IrcServer |
|
644 """ |
|
645 self.__server = server |
|
646 |
|
647 def setChannels(self, channels): |
|
648 """ |
|
649 Public method to set the list of channels. |
|
650 |
|
651 @param channels list of channels for the network |
|
652 @type list of IrcChannel |
|
653 """ |
|
654 self.__channels = {} |
|
655 for channel in channels: |
|
656 self.__channels[channel.getName()] = channel |
|
657 |
|
658 def getChannels(self): |
|
659 """ |
|
660 Public method to get the channels. |
|
661 |
|
662 @return list of channels for the network |
|
663 @rtype list of IrcChannel |
|
664 """ |
|
665 return list(copy.deepcopy(self.__channels).values()) |
|
666 |
|
667 def getChannelNames(self): |
|
668 """ |
|
669 Public method to get the list of channels. |
|
670 |
|
671 @return list of channel names |
|
672 @rtype list of str |
|
673 """ |
|
674 return sorted(self.__channels) |
|
675 |
|
676 def getChannel(self, channelName): |
|
677 """ |
|
678 Public method to get a channel. |
|
679 |
|
680 @param channelName name of the channel to retrieve |
|
681 @type str |
|
682 @return reference to the channel |
|
683 @rtype IrcChannel |
|
684 """ |
|
685 if channelName in self.__channels: |
|
686 return self.__channels[channelName] |
|
687 else: |
|
688 return None |
|
689 |
|
690 def setChannel(self, channel): |
|
691 """ |
|
692 Public method to set a channel. |
|
693 |
|
694 @param channel channel object to set |
|
695 @type IrcChannel |
|
696 """ |
|
697 channelName = channel.getName() |
|
698 if channelName in self.__channels: |
|
699 self.__channels[channelName] = channel |
|
700 |
|
701 def addChannel(self, channel): |
|
702 """ |
|
703 Public method to add a channel. |
|
704 |
|
705 @param channel channel object to add |
|
706 @type IrcChannel |
|
707 """ |
|
708 channelName = channel.getName() |
|
709 if channelName not in self.__channels: |
|
710 self.__channels[channelName] = channel |
|
711 |
|
712 def deleteChannel(self, channelName): |
|
713 """ |
|
714 Public method to delete the given channel. |
|
715 |
|
716 @param channelName name of the channel to be deleted |
|
717 @type str |
|
718 """ |
|
719 if channelName in self.__channels: |
|
720 del self.__channels[channelName] |
|
721 |
|
722 def setAutoConnect(self, enable): |
|
723 """ |
|
724 Public method to set the auto connect flag. |
|
725 |
|
726 @param enable flag indicate to connect to the network at start-up |
|
727 @type bool |
|
728 """ |
|
729 self.__autoConnect = enable |
|
730 |
|
731 def autoConnect(self): |
|
732 """ |
|
733 Public method to check, if the network should be connected to at |
|
734 start-up. |
|
735 |
|
736 @return flag indicating an auto connect |
|
737 @rtype bool |
|
738 """ |
|
739 return self.__autoConnect |
|
740 |
|
741 @classmethod |
|
742 def createDefaultNetwork(cls, ssl=False): |
|
743 """ |
|
744 Class method to create the default network. |
|
745 |
|
746 @param ssl flag indicating to create a SSL network configuration |
|
747 @type bool |
|
748 @return default network object |
|
749 @rtype IrcNetwork |
|
750 """ |
|
751 # network |
|
752 networkName = "libera.chat (SSL)" if ssl else "libera.chat" |
|
753 network = IrcNetwork(networkName) |
|
754 network.setIdentityName(IrcIdentity.DefaultIdentityName) |
|
755 |
|
756 # server |
|
757 serverName = "irc.libera.chat" |
|
758 server = IrcServer(serverName) |
|
759 if ssl: |
|
760 server.setPort(IrcServer.DefaultSslPort) |
|
761 server.setUseSSL(True) |
|
762 else: |
|
763 server.setPort(IrcServer.DefaultPort) |
|
764 network.setServer(server) |
|
765 |
|
766 # channel |
|
767 channel = IrcChannel("#eric-ide") |
|
768 channel.setAutoJoin(False) |
|
769 network.addChannel(channel) |
|
770 |
|
771 # auto connect |
|
772 network.setAutoConnect(False) |
|
773 |
|
774 return network |
|
775 |
|
776 |
|
777 class IrcNetworkManager(QObject): |
|
778 """ |
|
779 Class implementing the IRC identity object. |
|
780 |
|
781 @signal dataChanged() emitted after some data has changed |
|
782 @signal networksChanged() emitted after a network object has changed |
|
783 @signal identitiesChanged() emitted after an identity object has changed |
|
784 """ |
|
785 |
|
786 dataChanged = pyqtSignal() |
|
787 networksChanged = pyqtSignal() |
|
788 identitiesChanged = pyqtSignal() |
|
789 |
|
790 def __init__(self, parent=None): |
|
791 """ |
|
792 Constructor |
|
793 |
|
794 @param parent reference to the parent object |
|
795 @type QObject |
|
796 """ |
|
797 super().__init__(parent) |
|
798 |
|
799 self.__loaded = False |
|
800 self.__saveTimer = AutoSaver(self, self.save) |
|
801 |
|
802 self.__settings = Preferences.getSettings() |
|
803 |
|
804 self.__networks = {} |
|
805 self.__identities = {} |
|
806 |
|
807 self.dataChanged.connect(self.__saveTimer.changeOccurred) |
|
808 |
|
809 def close(self): |
|
810 """ |
|
811 Public method to close the open search engines manager. |
|
812 """ |
|
813 self.__saveTimer.saveIfNeccessary() |
|
814 |
|
815 def save(self): |
|
816 """ |
|
817 Public slot to save the IRC data. |
|
818 """ |
|
819 if not self.__loaded: |
|
820 return |
|
821 |
|
822 # save IRC data |
|
823 self.__settings.beginGroup("IRC") |
|
824 |
|
825 # identities |
|
826 self.__settings.remove("Identities") |
|
827 self.__settings.beginGroup("Identities") |
|
828 for key in self.__identities: |
|
829 self.__settings.beginGroup(key) |
|
830 self.__identities[key].save(self.__settings) |
|
831 self.__settings.endGroup() |
|
832 self.__settings.endGroup() |
|
833 |
|
834 # networks |
|
835 self.__settings.remove("Networks") |
|
836 self.__settings.beginGroup("Networks") |
|
837 for key in self.__networks: |
|
838 self.__settings.beginGroup(key) |
|
839 self.__networks[key].save(self.__settings) |
|
840 self.__settings.endGroup() |
|
841 self.__settings.endGroup() |
|
842 |
|
843 self.__settings.endGroup() |
|
844 |
|
845 def __load(self): |
|
846 """ |
|
847 Private slot to load the IRC data. |
|
848 """ |
|
849 if self.__loaded: |
|
850 return |
|
851 |
|
852 # load IRC data |
|
853 self.__settings.beginGroup("IRC") |
|
854 |
|
855 # identities |
|
856 self.__settings.beginGroup("Identities") |
|
857 for key in self.__settings.childGroups(): |
|
858 self.__identities[key] = IrcIdentity(key) |
|
859 self.__settings.beginGroup(key) |
|
860 self.__identities[key].load(self.__settings) |
|
861 self.__settings.endGroup() |
|
862 self.__settings.endGroup() |
|
863 |
|
864 # networks |
|
865 self.__settings.beginGroup("Networks") |
|
866 for key in self.__settings.childGroups(): |
|
867 self.__networks[key] = IrcNetwork(key) |
|
868 self.__settings.beginGroup(key) |
|
869 self.__networks[key].load(self.__settings) |
|
870 self.__settings.endGroup() |
|
871 self.__settings.endGroup() |
|
872 |
|
873 self.__settings.endGroup() |
|
874 |
|
875 if not self.__identities or not self.__networks: |
|
876 # data structures got corrupted; load defaults |
|
877 self.__loadDefaults() |
|
878 |
|
879 if IrcIdentity.DefaultIdentityName not in self.__identities: |
|
880 self.__loadDefaults(identityOnly=True) |
|
881 |
|
882 self.__loaded = True |
|
883 |
|
884 def __loadDefaults(self, identityOnly=False): |
|
885 """ |
|
886 Private method to load default values. |
|
887 |
|
888 @param identityOnly flag indicating to just load the default |
|
889 identity |
|
890 @type bool |
|
891 """ |
|
892 if not identityOnly: |
|
893 self.__networks = {} |
|
894 self.__identities = {} |
|
895 |
|
896 # identity |
|
897 identity = IrcIdentity.createDefaultIdentity() |
|
898 self.__identities[identity.getName()] = identity |
|
899 |
|
900 if not identityOnly: |
|
901 network = IrcNetwork.createDefaultNetwork() |
|
902 self.__networks[network.getName()] = network |
|
903 network = IrcNetwork.createDefaultNetwork(True) |
|
904 self.__networks[network.getName()] = network |
|
905 |
|
906 self.dataChanged.emit() |
|
907 |
|
908 ################################################################## |
|
909 ## Identity related methods below |
|
910 ################################################################## |
|
911 |
|
912 def getIdentity(self, name, create=False): |
|
913 """ |
|
914 Public method to get an identity object. |
|
915 |
|
916 @param name name of the identity to get |
|
917 @type str |
|
918 @param create flag indicating to create a new object, |
|
919 if none exists |
|
920 @type bool |
|
921 @return reference to the identity |
|
922 @rtype IrcIdentity |
|
923 """ |
|
924 if not name: |
|
925 return None |
|
926 |
|
927 if not self.__loaded: |
|
928 self.__load() |
|
929 |
|
930 if name in self.__identities: |
|
931 return self.__identities[name] |
|
932 elif create: |
|
933 ircId = IrcIdentity(name) |
|
934 self.__identities[name] = ircId |
|
935 |
|
936 self.dataChanged.emit() |
|
937 |
|
938 return ircId |
|
939 else: |
|
940 return None |
|
941 |
|
942 def getIdentities(self): |
|
943 """ |
|
944 Public method to get a copy of all identities. |
|
945 |
|
946 @return dictionary of all identities |
|
947 @rtype dict of IrcIdentity |
|
948 """ |
|
949 return copy.deepcopy(self.__identities) |
|
950 |
|
951 def setIdentities(self, identities): |
|
952 """ |
|
953 Public method to set the identities. |
|
954 |
|
955 @param identities dictionary of all identities |
|
956 @type dict of IrcIdentity |
|
957 """ |
|
958 self.__identities = copy.deepcopy(identities) |
|
959 self.identityChanged() |
|
960 |
|
961 # Check all networks, if the identity they use is still available. |
|
962 # If it isn't, change them to use the default identity. |
|
963 for network in self.__networks.values(): |
|
964 if network.getIdentityName() not in self.__identities: |
|
965 network.setIdentityName(IrcIdentity.DefaultIdentityName) |
|
966 |
|
967 def getIdentityNames(self): |
|
968 """ |
|
969 Public method to get the names of all identities. |
|
970 |
|
971 @return names of all identities |
|
972 @rtype list of string) |
|
973 """ |
|
974 return list(self.__identities) |
|
975 |
|
976 def addIdentity(self, identity): |
|
977 """ |
|
978 Public method to add a new identity. |
|
979 |
|
980 @param identity reference to the identity to add |
|
981 @type IrcIdentity |
|
982 """ |
|
983 name = identity.getName() |
|
984 self.__identities[name] = identity |
|
985 self.identityChanged() |
|
986 |
|
987 def deleteIdentity(self, name): |
|
988 """ |
|
989 Public method to delete the given identity. |
|
990 |
|
991 @param name name of the identity to delete |
|
992 @type str |
|
993 """ |
|
994 if name in self.__identities and name != IrcIdentity.DefaultIdentityName: |
|
995 del self.__identities[name] |
|
996 self.identityChanged() |
|
997 |
|
998 def renameIdentity(self, oldName, newName): |
|
999 """ |
|
1000 Public method to rename an identity. |
|
1001 |
|
1002 @param oldName old name of the identity |
|
1003 @type str |
|
1004 @param newName new name of the identity |
|
1005 @type str |
|
1006 """ |
|
1007 if oldName in self.__identities: |
|
1008 self.__identities[newName] = self.__identities[oldName] |
|
1009 del self.__identities[oldName] |
|
1010 |
|
1011 for network in self.__networks: |
|
1012 if network.getIdentityName() == oldName: |
|
1013 network.setIdentityName(newName) |
|
1014 |
|
1015 self.identityChanged() |
|
1016 |
|
1017 def identityChanged(self): |
|
1018 """ |
|
1019 Public method to indicate a change of an identity object. |
|
1020 """ |
|
1021 self.dataChanged.emit() |
|
1022 self.identitiesChanged.emit() |
|
1023 |
|
1024 ################################################################## |
|
1025 ## Network related methods below |
|
1026 ################################################################## |
|
1027 |
|
1028 def getNetwork(self, name): |
|
1029 """ |
|
1030 Public method to get a network object. |
|
1031 |
|
1032 @param name name of the network |
|
1033 @type str |
|
1034 @return reference to the network object |
|
1035 @rtype IrcNetwork |
|
1036 """ |
|
1037 if not self.__loaded: |
|
1038 self.__load() |
|
1039 |
|
1040 if name in self.__networks: |
|
1041 return self.__networks[name] |
|
1042 else: |
|
1043 return None |
|
1044 |
|
1045 def setNetwork(self, network, networkName=""): |
|
1046 """ |
|
1047 Public method to set a network. |
|
1048 |
|
1049 @param network network object to set |
|
1050 @type IrcNetwork |
|
1051 @param networkName name the network was known for |
|
1052 @type str |
|
1053 """ |
|
1054 name = network.getName() |
|
1055 if networkName and name != networkName: |
|
1056 # the network name has changed |
|
1057 self.deleteNetwork(networkName) |
|
1058 self.addNetwork(network) |
|
1059 elif name in self.__networks: |
|
1060 self.__networks[name] = network |
|
1061 self.networkChanged() |
|
1062 |
|
1063 def addNetwork(self, network): |
|
1064 """ |
|
1065 Public method to add a network. |
|
1066 |
|
1067 @param network network object to add |
|
1068 @type IrcNetwork |
|
1069 """ |
|
1070 name = network.getName() |
|
1071 if name not in self.__networks: |
|
1072 self.__networks[name] = network |
|
1073 self.networkChanged() |
|
1074 |
|
1075 def deleteNetwork(self, name): |
|
1076 """ |
|
1077 Public method to delete the given network. |
|
1078 |
|
1079 @param name name of the network to delete |
|
1080 @type str |
|
1081 """ |
|
1082 if name in self.__networks: |
|
1083 del self.__networks[name] |
|
1084 self.networkChanged() |
|
1085 |
|
1086 def networkChanged(self): |
|
1087 """ |
|
1088 Public method to indicate a change of a network object. |
|
1089 """ |
|
1090 self.dataChanged.emit() |
|
1091 self.networksChanged.emit() |
|
1092 |
|
1093 def getNetworkNames(self): |
|
1094 """ |
|
1095 Public method to get a list of all known network names. |
|
1096 |
|
1097 @return list of network names |
|
1098 @rtype list of str |
|
1099 """ |
|
1100 if not self.__loaded: |
|
1101 self.__load() |
|
1102 |
|
1103 return sorted(self.__networks) |