1
Files
isida-4/plugins/spy.py
2014-05-01 14:07:44 +04:00

116 lines
5.7 KiB
Python

#!/usr/bin/python
# -*- coding: utf-8 -*-
# --------------------------------------------------------------------------- #
# #
# Plugin for iSida Jabber Bot #
# Copyright (C) diSabler <dsy@dsy.name> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
# #
# --------------------------------------------------------------------------- #
spy_stat_time = int(time.time()) # время последнего сканирования
#conf hrs usrs msgs action
def spy_add(text,rn):
if text == '': return L('what do you want to add?',rn)
text = text.lower()
sconf = text.split(' ')[0]
try: saction = text.split(' ',1)[1]
except: return L('not given tracking',rn)
for tmp in saction.split(' '):
if tmp[0] != 'u' and tmp[0] != 'm':
return L('is not specified criterion tracking',rn)
try: int(tmp[1:])
except: return L('incorrect digital parameter',rn)
if sconf not in [t[0] for t in cur_execute_fetchone('select room from conference;')]: return L('I am not in the %s ',rn) % sconf
if cur_execute_fetchone('select room from spy where room=%s;',(sconf,)):
msg = L('Updated: %s',rn) % text
cur_execute('delete from spy where room=%s;',(sconf,))
else: msg = L('Append: %s',rn) % text
cnt = len(['' for t in megabase if t[0]==tmp[0]])
cur_execute('insert into spy values (%s,%s,%s,%s,%s)',(sconf,int(time.time()),cnt,0,saction))
return msg
def spy_del(text,rn):
if text == '': return L('what do you want remove?',rn)
text = text.lower().split(' ')[0]
if cur_execute_fetchone('select room from spy where room=%s;',(text,)):
cur_execute('delete from spy where room=%s;',(text,))
return L('Removed: %s',rn) % text
else: return L('Not found: %s',rn) % text
def spy_show(rn):
sb = cur_execute_fetchall('select * from spy;')
if not sb: return L('List is empty.')
msg = L('Monitoring conferences:',rn)
msg += '\n%s' % '\n'.join(['%s %s (%s|u%s|m%s)' % (tmp[0],tmp[4],un_unix(int(time.time()-tmp[1]),rn),tmp[2],tmp[3]) for tmp in sb])
msg += L('\nNext scanning across %s',rn) % un_unix(int(GT('scan_time')-(time.time()-spy_stat_time)),rn)
return msg
def conf_spy(type, jid, nick,text):
text = text.strip().lower()
rn = '%s/%s'%(jid,nick)
msg = None
if text.startswith('add '): msg = spy_add(text[4:],rn)
elif text.startswith('del '): msg = spy_del(text[4:],rn)
elif text == 'show': msg = spy_show(rn)
if not msg: msg = L('Smoke help about command!',rn)
send_msg(type, jid, nick, msg)
def spy_message(room,jid,nick,type,text):
sb = cur_execute_fetchone('select message from spy where room=%s;',(room,))
if sb: cur_execute('update spy set message=message+1 where room=%s',(room,))
def get_spy_stat():
global spy_stat_time
if time.time()-spy_stat_time < GT('scan_time'): return None
spy_stat_time = time.time()
sb = cur_execute_fetchone('select room from spy;')
if sb:
for tmp in sb:
cnt = len(['' for t in megabase if t[0]==tmp[0]])
cur_execute('update spy set participant=(participant+%s)/2 where room=%s',(cnt,tmp[0]))
def spy_action():
try:
if cur_execute_fetchone('select count(*) from conference;')[0] == 1: raise
except: return None # Last conference
sb = cur_execute_fetchall('select * from spy where %s-time>%s;',(int(time.time()),GT('spy_action_time')))
for tmp in sb:
act = tmp[4].split(' ')
mist = None
for tmp2 in act:
if tmp2[0] == 'u' and int(tmp2[1:]) > tmp[2]: mist = tmp2
elif tmp2[0] == 'm' and int(tmp2[1:]) > tmp[3]: mist = tmp2
cur_execute('delete from spy where room=%s',(tmp[0],))
if mist:
if cur_execute_fetchall('select * from conference where room ilike %s;', ('%s/%%'%getRoom(tmp[0]),)):
cur_execute('delete from conference where room ilike %s;', ('%s/%%'%getRoom(tmp[0]),))
leave(tmp[0], L('I leave your conference because low activity'))
pprint('*** Leave room: %s by spy activity!' % tmp[0],'red')
own = cur_execute_fetchall('select * from bot_owner;')
if own:
for tmpo in own: send_msg('chat', tmpo[0], '', L('I leave conference %s by condition spy plugin: %s') % (tmp[0], mist))
else: cur_execute('insert into spy values (%s,%s,%s,%s,%s)',(tmp[0],int(time.time()),tmp[2], 0,tmp[4]))
global execute, timer, message_control
timer = [get_spy_stat, spy_action]
message_control = [spy_message]
execute = [(9, 'spy', conf_spy, 2, 'Check conference activity\nspy add <conference>[ u<number>][ m<number>] - add conference to list. u - count users, m - count message per night. At default At least one condition - the bot will leave the conference\nspy del <conference> - remove conference from list\nspy show - show active monitoring.')]