write code to synchronise server logs from archiving with local DB
This commit is contained in:
parent
e4128f5c29
commit
72420b0e73
|
@ -53,6 +53,9 @@ from common.commands import ConnectionCommands
|
||||||
from common.pubsub import ConnectionPubSub
|
from common.pubsub import ConnectionPubSub
|
||||||
from common.caps import ConnectionCaps
|
from common.caps import ConnectionCaps
|
||||||
from common.message_archiving import ConnectionArchive
|
from common.message_archiving import ConnectionArchive
|
||||||
|
from common.message_archiving import ARCHIVING_COLLECTIONS_ARRIVED
|
||||||
|
from common.message_archiving import ARCHIVING_COLLECTION_ARRIVED
|
||||||
|
from common.message_archiving import ARCHIVING_MODIFICATIONS_ARRIVED
|
||||||
|
|
||||||
if gajim.HAVE_FARSIGHT:
|
if gajim.HAVE_FARSIGHT:
|
||||||
from common.jingle import ConnectionJingle
|
from common.jingle import ConnectionJingle
|
||||||
|
@ -1235,6 +1238,72 @@ class ConnectionVcard:
|
||||||
form = common.dataforms.ExtendForm(node=form_tag)
|
form = common.dataforms.ExtendForm(node=form_tag)
|
||||||
self.dispatch('PEP_CONFIG', (node, form))
|
self.dispatch('PEP_CONFIG', (node, form))
|
||||||
|
|
||||||
|
elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTIONS_ARRIVED:
|
||||||
|
# TODO
|
||||||
|
pass
|
||||||
|
|
||||||
|
elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTION_ARRIVED:
|
||||||
|
def save_if_not_exists(with_, direction, tim, payload):
|
||||||
|
assert len(payload) == 1, 'got several archiving messages in the' +\
|
||||||
|
' same time %s' % ''.join(payload)
|
||||||
|
if payload[0].getName() == 'body':
|
||||||
|
gajim.logger.save_if_not_exists(with_, direction, tim,
|
||||||
|
msg=payload[0].getData())
|
||||||
|
elif payload[0].getName() == 'message':
|
||||||
|
print 'Not implemented'
|
||||||
|
chat = iq_obj.getTag('chat')
|
||||||
|
if chat:
|
||||||
|
with_ = chat.getAttr('with')
|
||||||
|
start_ = chat.getAttr('start')
|
||||||
|
tim = helpers.datetime_tuple(start_)
|
||||||
|
tim = timegm(tim)
|
||||||
|
nb = 0
|
||||||
|
for element in chat.getChildren():
|
||||||
|
try:
|
||||||
|
secs = int(element.getAttr('secs'))
|
||||||
|
except TypeError:
|
||||||
|
secs = 0
|
||||||
|
if secs:
|
||||||
|
tim += secs
|
||||||
|
if element.getName() == 'from':
|
||||||
|
save_if_not_exists(with_, 'from', localtime(tim),
|
||||||
|
element.getPayload())
|
||||||
|
nb += 1
|
||||||
|
if element.getName() == 'to':
|
||||||
|
save_if_not_exists(with_, 'to', localtime(tim),
|
||||||
|
element.getPayload())
|
||||||
|
nb += 1
|
||||||
|
set_ = chat.getTag('set')
|
||||||
|
first = set_.getTag('first')
|
||||||
|
if first:
|
||||||
|
try:
|
||||||
|
index = int(first.getAttr('index'))
|
||||||
|
except TypeError:
|
||||||
|
index = 0
|
||||||
|
try:
|
||||||
|
count = int(set_.getTagData('count'))
|
||||||
|
except TypeError:
|
||||||
|
count = 0
|
||||||
|
if count > index + nb:
|
||||||
|
# Request the next page
|
||||||
|
try:
|
||||||
|
after = int(element.getTagData('last'))
|
||||||
|
except TypeError:
|
||||||
|
after = index + nb
|
||||||
|
self.request_collection_page(with_, start_, after=after)
|
||||||
|
|
||||||
|
elif self.awaiting_answers[id_][0] == ARCHIVING_MODIFICATIONS_ARRIVED:
|
||||||
|
modified = iq_obj.getTag('modified')
|
||||||
|
if modified:
|
||||||
|
for element in modified.getChildren():
|
||||||
|
if element.getName() == 'changed':
|
||||||
|
with_ = element.getAttr('with')
|
||||||
|
start_ = element.getAttr('start')
|
||||||
|
self.request_collection_page(with_, start_)
|
||||||
|
elif element.getName() == 'removed':
|
||||||
|
# do nothing
|
||||||
|
pass
|
||||||
|
|
||||||
del self.awaiting_answers[id_]
|
del self.awaiting_answers[id_]
|
||||||
|
|
||||||
def _vCardCB(self, con, vc):
|
def _vCardCB(self, con, vc):
|
||||||
|
|
|
@ -981,4 +981,34 @@ class Logger:
|
||||||
(account_jid_id,))
|
(account_jid_id,))
|
||||||
self.con.commit()
|
self.con.commit()
|
||||||
|
|
||||||
|
def save_if_not_exists(self, with_, direction, tim, msg=''):
|
||||||
|
if tim:
|
||||||
|
time_col = int(float(time.mktime(tim)))
|
||||||
|
else:
|
||||||
|
time_col = int(float(time.time()))
|
||||||
|
if msg:
|
||||||
|
if self.jid_is_from_pm(with_):
|
||||||
|
# We cannot know if it's a pm or groupchat message because we only
|
||||||
|
# get body of the message
|
||||||
|
type_ = 'gc_msg'
|
||||||
|
else:
|
||||||
|
if direction == 'from':
|
||||||
|
type_ = 'chat_msg_recv'
|
||||||
|
elif direction == 'to':
|
||||||
|
type_ = 'chat_msg_sent'
|
||||||
|
jid_id = self.get_jid_id(with_)
|
||||||
|
where_sql = 'jid_id = %s AND message="%s"' % (jid_id, msg)
|
||||||
|
start_time = time_col - 300 # 5 minutes arrount given time
|
||||||
|
end_time = time_col + 300 # 5 minutes arrount given time
|
||||||
|
self.cur.execute('''
|
||||||
|
SELECT log_line_id FROM logs
|
||||||
|
WHERE (%s)
|
||||||
|
AND time BETWEEN %d AND %d
|
||||||
|
ORDER BY time
|
||||||
|
''' % (where_sql, start_time, end_time))
|
||||||
|
results = self.cur.fetchall()
|
||||||
|
if results:
|
||||||
|
return
|
||||||
|
self.write(type_, with_, message=msg, tim=tim)
|
||||||
|
|
||||||
# vim: se ts=3:
|
# vim: se ts=3:
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
|
|
||||||
import common.xmpp
|
import common.xmpp
|
||||||
|
|
||||||
|
ARCHIVING_COLLECTIONS_ARRIVED = 'archiving_collections_arrived'
|
||||||
|
ARCHIVING_COLLECTION_ARRIVED = 'archiving_collection_arrived'
|
||||||
|
ARCHIVING_MODIFICATIONS_ARRIVED = 'archiving_modifications_arrived'
|
||||||
|
|
||||||
class ConnectionArchive:
|
class ConnectionArchive:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -192,6 +195,9 @@ class ConnectionArchive:
|
||||||
set_.setTagData('max', max)
|
set_.setTagData('max', max)
|
||||||
if after:
|
if after:
|
||||||
set_.setTagData('after', after)
|
set_.setTagData('after', after)
|
||||||
|
id_ = self.connection.getAnID()
|
||||||
|
iq_.setID(id_)
|
||||||
|
self.awaiting_answers[id_] = (ARCHIVING_COLLECTIONS_ARRIVED, )
|
||||||
self.connection.send(iq_)
|
self.connection.send(iq_)
|
||||||
|
|
||||||
def request_collection_page(self, with, start, end=None, after=None,
|
def request_collection_page(self, with, start, end=None, after=None,
|
||||||
|
@ -205,6 +211,9 @@ class ConnectionArchive:
|
||||||
set_.setTagData('max', max)
|
set_.setTagData('max', max)
|
||||||
if after:
|
if after:
|
||||||
set_.setTagData('after', after)
|
set_.setTagData('after', after)
|
||||||
|
id_ = self.connection.getAnID()
|
||||||
|
iq_.setID(id_)
|
||||||
|
self.awaiting_answers[id_] = (ARCHIVING_COLLECTION_ARRIVED, )
|
||||||
self.connection.send(iq_)
|
self.connection.send(iq_)
|
||||||
|
|
||||||
def remove_collection(self, with='', start=None, end=None,
|
def remove_collection(self, with='', start=None, end=None,
|
||||||
|
@ -223,12 +232,13 @@ class ConnectionArchive:
|
||||||
remove.setAttr('open', 'true')
|
remove.setAttr('open', 'true')
|
||||||
self.connection.send(iq_)
|
self.connection.send(iq_)
|
||||||
|
|
||||||
def request_modifications_page(self, start, version, after=None, max=30):
|
def request_modifications_page(self, start, max=30):
|
||||||
iq_ = common.xmpp.Iq('get')
|
iq_ = common.xmpp.Iq('get')
|
||||||
moified = iq_.setTag('modified', namespace=common.xmpp.NS_ARCHIVE,
|
moified = iq_.setTag('modified', namespace=common.xmpp.NS_ARCHIVE,
|
||||||
attrs={'start': start, 'version': version})
|
attrs={'start': start})
|
||||||
set_ = retrieve.setTag('set', namespace=common.xmpp.NS_RSM)
|
set_ = moified.setTag('set', namespace=common.xmpp.NS_RSM)
|
||||||
set_.setTagData('max', max)
|
set_.setTagData('max', max)
|
||||||
if after:
|
id_ = self.connection.getAnID()
|
||||||
set_.setTagData('after', after)
|
iq_.setID(id_)
|
||||||
|
self.awaiting_answers[id_] = (ARCHIVING_MODIFICATIONS_ARRIVED, )
|
||||||
self.connection.send(iq_)
|
self.connection.send(iq_)
|
||||||
|
|
|
@ -3405,6 +3405,7 @@ class Interface:
|
||||||
self.last_ftwindow_update = 0
|
self.last_ftwindow_update = 0
|
||||||
|
|
||||||
self.music_track_changed_signal = None
|
self.music_track_changed_signal = None
|
||||||
|
self.create_ipython_window()
|
||||||
|
|
||||||
|
|
||||||
class PassphraseRequest:
|
class PassphraseRequest:
|
||||||
|
|
Loading…
Reference in New Issue