64
73
def __init__(self,controller,conversation,MainClass,addButton = True):
65
74
'''Save the identifier of this conversation and begin to log message'''
75
self.controller = controller
76
self.mainClass = MainClass
67
79
#This identifier enable the check of members change!
68
80
self.members = conversation.getMembers()
69
81
self.idMyLog = self.members[0]
70
82
for mem in self.members[1:len(self.members)]:
71
83
self.idMyLog = self.idMyLog + '-' + mem
84
self.lastUserName = ''
73
86
#The identifier of this conversation is the id of conversation
74
87
self.idConv = id(conversation)
75
88
self.conversation = conversation
77
self.mainClass = MainClass
78
#self.mainClass.activeLogger.append(self)
81
self.convId = conversation
82
self.controller = controller
83
#Every time the conversationManager send a close-conversation-ui
85
self.convmanagerId = self.controller.conversationManager.connect('close-conversation-ui', self.stop)
87
#We need to remember last username to show group conversation.
88
#Patched by Nelson (nelson at csie dot us)
89
self.lastUserName = ''
91
90
#We would save logs in :
92
#paths.CONFIG_DIR join controller.config.getCurrentUser() join html_logs
93
self.logDir = os.path.join(CONFIG_PATH, \
94
controller.config.getCurrentUser()) #this dir exist!
95
maybeFaultDir = os.path.join(self.logDir, \
96
'html_logs') #This is created at the first run
91
self.logDir = os.path.join(self.mainClass.logsDir, \
92
time.strftime('%B_%Y', time.localtime(time.time()))) #This is created at the first run
98
94
#If the log dir not exist create it
99
if os.path.exists(maybeFaultDir):
100
self.logDir = maybeFaultDir
102
os.mkdir(maybeFaultDir)
103
# ugly, but "if os.mkdir(..)" doesn't work :S
104
if os.path.exists(maybeFaultDir):
105
self.logDir = maybeFaultDir
106
# if we can't create the dir, we put the file directly
95
if not os.path.exists(self.logDir):
98
except: #in case we can't create the dir with the date
99
self.logDir = self.mainClass.logsDir
110
101
#Create the log FileName
111
102
self.logFileName = os.path.join(self.logDir, \
151
135
self.sendmessageId = self.controller.conversationManager.connect( \
152
136
'send-message', self.logSendMessage)
153
137
self.receivemessageId = self.controller.conversationManager.connect( \
154
'receive-message', self.logReceivedMessage)
155
self.receiveOffmessageId = self.mainClass.connect( \
156
'offline-message-received', self.logOffReceivedMessage)
157
self.fileTransferId = self.p2p.connect('file-transfer-accepted',self.logFileTransfer)
138
'receive-message', self.logReceivedMessage)
139
self.fileTransferId = self.p2p.connect('file-transfer-accepted',\
140
self.logFileTransfer)
141
#Every time the conversationManager send a close-conversation-ui
143
self.closeUIId = self.controller.conversationManager.connect(\
144
'close-conversation-ui', self.stop)
160
147
#Add a button to the toolbar of this conversation:
161
self.logButton = gtk.ToolButton()
162
self.logButton.set_label(_('Logs'))
148
self.logButton = gtk.ToolButton(label=_('Logs'))
163
149
self.logButton.set_stock_id(gtk.STOCK_DND)
164
150
if self.controller.theme.getImage('log'):
165
151
imagelog = gtk.Image()
166
152
imagelog.set_from_pixbuf(self.controller.theme.getImage('log'))
168
154
self.logButton.set_icon_widget(imagelog)
169
self.logButton.connect('clicked',self.viewLog)
155
self.logButton.connect('clicked', self.mainClass.viewLog, self.logFileName)
171
157
self.logButton.set_tooltip_text(_('View the logs of this conversation'))
173
159
conversation.ui.input.toolbar.insert(gtk.SeparatorToolItem(), -1)
174
160
conversation.ui.input.toolbar.insert(self.logButton, -1)
176
161
conversation.ui.input.toolbar.show_all()
179
def viewLog(self, *args):
180
desktop.open(self.logFileName)
163
def start_conv_log(self):
165
started = _('Started at: ')
166
self.logFile.write('<hr align=\"left\" />\n')
167
self.logFile.write('\n<span><span style=\"font-size: 10pt;font-weight: bold;\"> ' + started)
168
self.logFile.write(time.strftime('%a, %d %b %Y %H:%M:%S', time.localtime(time.time())))
169
self.logFile.write('.<br/></span></span>\n')
182
173
def logSendMessage(self, obj, conversation, message):
183
174
'''message is a list of string'''
185
175
idThisLog = id(conversation)
187
177
#Log this message if the id match
188
178
if idThisLog == self.idConv:
179
if not self.modified:
180
self.start_conv_log()
189
181
#Members have changed??
190
182
members = conversation.getMembers()
191
183
mbThisLog = members[0]
213
207
if mbThisLog != self.idMyLog:
215
209
self.__init__(self.controller,self.conversation,self.mainClass,False)
210
self.mainClass.activeLoggers.append(self)
217
212
self.appendOutputText(mail, message, 'incoming', \
218
213
conversation.parseFormat(mail, format))
220
def logOffReceivedMessage(self, msnp, oim):
221
'''called when someone sent an offline message'''
223
user, date, message = oim
226
result = self.controller.conversationManager.getOpenConversation(mail)
228
idThisLog = id(result[1]) #conversation
229
if idThisLog == self.idConv:
230
self.appendOutputText(mail, message, 'offline_incoming', \
233
215
def logFileTransfer(self, p2p, session, context, sender):
265
250
timestamp = time.time()
267
252
if self.lastUserName == username:
253
if type != "offline_incoming":
254
type = "consecutive_"+type
268
255
displayedText = self.controller.conversationLayoutManager.layout(\
269
username, text, style, self.convId, 'consecutive_' + type, timestamp, ink)
256
username, text, style, self.conversation, type, timestamp, ink)
271
258
self.lastUserName = username
272
259
displayedText = self.controller.conversationLayoutManager.layout(\
273
username, text, style, self.convId, type, timestamp, ink)
260
username, text, style, self.conversation, type, timestamp, ink)
275
262
#erase custom emoticons
276
263
displayedText = self.fromCustomEmoticonsToText(displayedText)
278
264
self.logFile.write('<!---->' + displayedText)
279
265
self.logFile.write('\n')
280
266
self.logFile.flush()
282
268
def stop(self, conversationManager = None, conversation = None, window = None):
283
269
'''Close this logger if the id of the conversation closed match with self.idMyLog'''
293
278
#Close this logger if the id match
294
279
if idThisLog == self.idConv:
296
closed = _('Closed at: ')
297
self.logFile.write('\n<span><span style=\"font-size: 10pt;font-weight: bold;\">'+ closed)
298
self.logFile.write(time.strftime('%a, %d %b %Y %H:%M:%S',time.localtime(time.time())))
299
self.logFile.write('.<br/></span></span>\n')
300
#Tail of the document
301
self.logFile.write('\n</body></html>\n')
282
closed = _('Closed at: ')
283
self.logFile.write('\n<span><span style=\"font-size: 10pt;font-weight: bold;\">'+ closed)
284
self.logFile.write(time.strftime('%a, %d %b %Y %H:%M:%S',time.localtime(time.time())))
285
self.logFile.write('.<br/></span></span>\n')
286
#Tail of the document
287
self.logFile.write('\n</body></html>\n')
303
289
self.logFile.close()
305
291
self.controller.conversationManager.disconnect(self.sendmessageId)
306
292
self.controller.conversationManager.disconnect(self.receivemessageId)
307
self.controller.conversationManager.disconnect(self.convmanagerId)
308
self.mainClass.disconnect(self.receiveOffmessageId)
293
self.controller.conversationManager.disconnect(self.closeUIId)
309
294
self.p2p.disconnect(self.fileTransferId)
310
295
self.stopped = True
296
self.mainClass.activeLoggers.remove(self)
312
298
def fromCustomEmoticonsToText(self,message):
365
351
class MainClass(Plugin.Plugin):
366
352
'''Main plugin class'''
368
description = _('Log every session with friendEmail in:\n' +\
369
'~/.config/emesene1.0/<address>/html_logs/friendEmail.html')
370
authors = { 'Marramao' : 'maramaopercheseimorto@gmail.com'}
354
description = _('Log every session with friendEmail in:\n' + \
355
'~/.config/emesene1.0/<address>/html_logs/month_year/friendEmail.html')
356
authors = { 'Marramao' : 'maramaopercheseimorto@gmail.com', \
357
'arielj' : 'arieljuod@gmail.com' }
371
358
website = 'emesene.org'
372
359
displayName = _('Conversation Logger')
373
360
name = 'LogConversation'
377
362
def __init__(self, controller, msn):
379
364
Plugin.Plugin.__init__(self, controller, msn)
381
self.description = _('Log every session with friendEmail in:\n' +\
382
'~/.config/emesene1.0/<address>/html_logs/friendEmail.html')
383
self.authors = { 'Marramao' : 'maramaopercheseimorto@gmail.com'}
384
self.website = 'emesene.org'
385
self.displayName = _('Conversation Logger')
386
self.name = 'LogConversation'
388
366
self.controller = controller
389
367
self.config = controller.config
390
368
self.config.readPluginConfig(self.name)
393
self.convmanagerId = 0
394
#self.debug( '[LogConv] Initialized.\n')
370
self.activeLoggers = []
399
373
'''start the plugin'''
400
if self.enabled ==False:
401
self.convmanagerId = self.controller.conversationManager.connect( \
374
self.convmanagerId = self.controller.conversationManager.connect( \
402
375
'new-conversation-ui', self.connectLogger)
403
self.menuItemId = self.controller.connect("usermenu-item-add", self.add_usermenu_item)
376
self.menuItemId = self.controller.connect("usermenu-item-add", \
377
self.add_usermenu_item)
378
self.offlineMessages = self.connect('offline-message-received', \
379
self.logOffReceivedMessage)
381
self.logsDir = os.path.join(CONFIG_PATH, \
382
self.controller.config.getCurrentUser(), 'html_logs')
384
if not os.path.isdir(self.logsDir):
385
os.mkdir(self.logsDir)
405
387
self.enabled = True
407
#self.debug( '[LogConv] Started.\n')
409
389
def connectLogger (self, conversationManager, conversation, window):
410
self.newLogger = MyLogger(self.controller,conversation,self)
390
self.activeLoggers.append(MyLogger(self.controller,conversation,self))
392
def logOffReceivedMessage(self, msnp, oim):
393
'''used when a new conversation is opened by an offline message'''
395
user, date, message = oim
397
result = self.controller.conversationManager.getOpenConversation(mail)
399
if result is not None:
400
conversation = result[1]
401
for logger in self.activeLoggers:
402
if logger.conversation == conversation:
405
logger.appendOutputText(mail, message, 'offline_incoming', \
413
gobject.timeout_add(500, check, oim)
412
415
def add_usermenu_item(self, controller, userMenu):
413
logDir = os.path.join(CONFIG_PATH, \
414
controller.config.getCurrentUser())
415
maybeFaultDir = os.path.join(logDir, \
417
if os.path.exists(maybeFaultDir):
418
logDir = maybeFaultDir
420
os.mkdir(maybeFaultDir)
421
if os.path.exists(maybeFaultDir):
422
self.logDir = maybeFaultDir
423
self.logFileName = os.path.join(logDir, \
424
userMenu.user.email + '.html')
426
if os.path.exists(self.logFileName):
427
self.logMenuItem = userMenu.newImageMenuItem( _( "Logs of this conversation" ),
429
if self.controller.theme.getImage('log'):
430
imagelog = gtk.Image()
431
imagelog.set_from_pixbuf(self.controller.theme.getImage('log'))
433
self.logMenuItem.set_icon_widget(imagelog)
434
userMenu.viewMenu.add( self.logMenuItem )
435
self.logMenuItem.show()
436
self.logMenuItem.connect( 'activate', self.viewLog )
438
def viewLog(self, *args):
439
desktop.open(self.logFileName)
416
dates = os.listdir(self.logsDir)
417
logMenuItem = userMenu.newImageMenuItem( _( "Logs of this user" ),
419
if self.controller.theme.getImage('log'):
420
imagelog = gtk.Image()
421
imagelog.set_from_pixbuf(self.controller.theme.getImage('log'))
423
logMenuItem.set_icon_widget(imagelog)
426
logsAvailables = False
428
logFileName = os.path.join(self.logsDir, date, \
429
userMenu.user.email + '.html')
430
if os.path.exists(logFileName):
431
newMenuItem = gtk.MenuItem(label=date)
432
newMenuItem.connect( 'activate', self.viewLog, logFileName )
433
submenu.append(newMenuItem)
434
logsAvailables = True
437
logMenuItem.set_submenu(submenu)
438
userMenu.viewMenu.add(logMenuItem)
439
logMenuItem.show_all()
441
def viewLog(self, menuitem, logFileName):
442
desktop.open(logFileName)
442
445
'''stop the plugin'''
443
446
self.controller.conversationManager.disconnect(self.convmanagerId)
444
#print '[LogConv]I\'m going to close %d active loggers.' % len(self.activeLogger)
445
447
self.controller.disconnect(self.menuItemId)
448
self.disconnect(self.offlineMessages)
447
if len(self.activeLogger) > 0:
448
for myLogger in self.activeLogger:
450
for myLogger in self.activeLoggers:
451
453
self.enabled = False
452
#self.debug( '[LogConv] Stopped.\n')
455
456
return (True, 'Ok')