add: initial AI support
This commit is contained in:
166
plugins/backup.py
Normal file
166
plugins/backup.py
Normal file
@@ -0,0 +1,166 @@
|
||||
#!/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/>. #
|
||||
# #
|
||||
# --------------------------------------------------------------------------- #
|
||||
|
||||
backup_async = {}
|
||||
|
||||
def getMucItems(jid,affil,ns,back_id):
|
||||
iqid = get_id()
|
||||
if ns == xmpp.NS_MUC_ADMIN: i = xmpp.Node('iq', {'id': iqid, 'type': 'get', 'to':getRoom(jid)}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':affil})])])
|
||||
else: i = xmpp.Node('iq', {'id': iqid, 'type': 'get', 'to':getRoom(jid)}, payload = [xmpp.Node('query', {'xmlns': ns},[])])
|
||||
iq_request[iqid]=(time.time(),getMucItems_async,[ns,affil,back_id],ns)
|
||||
sender(i)
|
||||
|
||||
def getMucItems_async(ns,affil,back_id,iq_stanza):
|
||||
global backup_async
|
||||
iq_stanza = iq_stanza[1][0]
|
||||
if ns == xmpp.NS_MUC_ADMIN: backup_async[back_id][affil] = [[tmp.getAttr('jid'),['',tmp.getTagData('reason')][tmp.getTagData('reason') != None]] for tmp in iq_stanza.getTag('query',namespace=xmpp.NS_MUC_ADMIN).getTags('item')]
|
||||
else: backup_async[back_id]['room_config'] = [[tmp.getAttr('var'),tmp.getAttr('type'),tmp.getTagData('value')] for tmp in iq_stanza.getTag('query',namespace=xmpp.NS_MUC_OWNER).getTag('x',namespace=xmpp.NS_DATA).getTags('field')]
|
||||
|
||||
def make_stanzas_array(raw_back,jid,affil):
|
||||
stanza_array = []
|
||||
try: make_stanza_jid_count = get_config_int(jid,'make_stanza_jid_count')
|
||||
except: make_stanza_jid_count = 1
|
||||
for tmp in range(0,len(raw_back),make_stanza_jid_count):
|
||||
i = xmpp.Iq(typ='set',to=jid,xmlns=xmpp.NS_CLIENT)
|
||||
i.setTag('query',namespace=xmpp.NS_MUC_ADMIN)
|
||||
for t in raw_back[tmp:tmp+make_stanza_jid_count]:
|
||||
i.getTag('query',namespace=xmpp.NS_MUC_ADMIN).\
|
||||
setTag('item',attrs={'affiliation':affil,'jid':t[0]}).\
|
||||
setTagData('reason',t[1])
|
||||
stanza_array.append(i)
|
||||
return stanza_array
|
||||
|
||||
def conf_backup(type, jid, nick, text):
|
||||
global backup_async,conn
|
||||
if len(text):
|
||||
text = text.split(' ')
|
||||
mode = text[0]
|
||||
|
||||
if mode == 'show':
|
||||
a = os.listdir(back_folder % '')
|
||||
b = []
|
||||
for c in a:
|
||||
if not c.endswith('.txt') and not c.endswith('.back'): b.append((c,os.path.getmtime(back_folder % c)))
|
||||
if len(b): msg = '%s %s' % (L('Available copies:','%s/%s'%(jid,nick)), ', '.join(['%s (%s)' % (c[0],disp_time(c[1],'%s/%s'%(jid,nick))) for c in b]))
|
||||
else: msg = L('Backup copies not found.','%s/%s'%(jid,nick))
|
||||
elif mode == 'now':
|
||||
|
||||
if get_xtype(jid) != 'owner': msg = L('I need an owner affiliation for backup settings!','%s/%s'%(jid,nick))
|
||||
else:
|
||||
back_id = get_id()
|
||||
backup_async[back_id] = {}
|
||||
getMucItems(jid,'outcast',xmpp.NS_MUC_ADMIN,back_id)
|
||||
getMucItems(jid,'member',xmpp.NS_MUC_ADMIN,back_id)
|
||||
getMucItems(jid,'admin',xmpp.NS_MUC_ADMIN,back_id)
|
||||
getMucItems(jid,'owner',xmpp.NS_MUC_ADMIN,back_id)
|
||||
getMucItems(jid,'',xmpp.NS_MUC_OWNER,back_id)
|
||||
bst = GT('backup_sleep_time')
|
||||
while len(backup_async[back_id]) != 5 and not game_over: time.sleep(bst)
|
||||
iqid = get_id()
|
||||
i = xmpp.Node('iq', {'id': iqid, 'type': 'set', 'to':jid}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':'admin', 'jid':getRoom(str(selfjid))},[])])])
|
||||
sender(i)
|
||||
backup_async[back_id]['alias'] = cur_execute_fetchall('select match ,cmd from alias where room=%s',(jid,))
|
||||
backup_async[back_id]['bot_config'] = cur_execute_fetchall('select option ,value from config_conf where room=%s',(jid,))
|
||||
backup_async[back_id]['acl'] = cur_execute_fetchall('select action,type,text,command,time,level from acl where jid=%s',(jid,))
|
||||
backup_async[back_id]['rss'] = cur_execute_fetchall('select url, update ,type,time,hash from feed where room=%s',(jid,))
|
||||
|
||||
msg = L('Copying completed!','%s/%s'%(jid,nick))
|
||||
msg += L('\nOwners: %s | Admins: %s | Members: %s | Banned: %s','%s/%s'%(jid,nick)) % (\
|
||||
len(backup_async[back_id]['owner'])-1,\
|
||||
len(backup_async[back_id]['admin'])+1,\
|
||||
len(backup_async[back_id]['member']),\
|
||||
len(backup_async[back_id]['outcast']))
|
||||
|
||||
msg += L('\nRoom config: %s | Bot config: %s | Aliases: %s | Acl\'s: %s | RSS: %s','%s/%s'%(jid,nick)) % (\
|
||||
len(backup_async[back_id]['room_config']),\
|
||||
len(backup_async[back_id]['bot_config']),\
|
||||
len(backup_async[back_id]['alias']),\
|
||||
len(backup_async[back_id]['acl']),\
|
||||
len(backup_async[back_id]['rss']))
|
||||
|
||||
writefile(back_folder % unicode(jid),json.dumps(backup_async[back_id]))
|
||||
|
||||
elif mode == 'restore':
|
||||
if len(text)>1:
|
||||
if text[1] in os.listdir(back_folder % ''):
|
||||
if text[1].endswith('.acl'):
|
||||
raw_back = json.loads(readfile(back_folder % unicode(text[1])))
|
||||
cnt = 0
|
||||
for tmp in raw_back:
|
||||
isit = cur_execute_fetchall('select action,type,text,command,time from acl where jid=%s and action=%s and type=%s and text=%s and level=%s',(jid,tmp[0],tmp[1],tmp[2],tmp[5]))
|
||||
if not isit:
|
||||
cur_execute('insert into acl values (%s,%s,%s,%s,%s,%s,%s)', tmp)
|
||||
cnt += 1
|
||||
msg = L('Restored %s action(s).','%s/%s'%(jid,nick)) % cnt
|
||||
elif get_xtype(jid) != 'owner': msg = L('I need an owner affiliation for restore settings!','%s/%s'%(jid,nick))
|
||||
else:
|
||||
bst = GT('backup_sleep_time')
|
||||
raw_back=json.loads(readfile(back_folder % unicode(text[1])))
|
||||
for tmp in ['outcast','member','admin','owner']:
|
||||
for t in make_stanzas_array(raw_back[tmp],jid,tmp):
|
||||
sender(t)
|
||||
time.sleep(bst)
|
||||
i = xmpp.Iq(typ='set',to=jid,xmlns=xmpp.NS_CLIENT)
|
||||
i.setTag('query',namespace=xmpp.NS_MUC_OWNER)
|
||||
i.getTag('query',namespace=xmpp.NS_MUC_OWNER).setTag('x',namespace=xmpp.NS_DATA).setAttr('type','submit')
|
||||
for tmp in raw_back['room_config']:
|
||||
i.getTag('query',namespace=xmpp.NS_MUC_OWNER).getTag('x',namespace=xmpp.NS_DATA).\
|
||||
setTag('field',attrs={'var':tmp[0],'type':tmp[1]}).\
|
||||
setTagData('value',tmp[2])
|
||||
sender(i)
|
||||
time.sleep(bst)
|
||||
sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':jid}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':'admin', 'jid':getRoom(unicode(selfjid))},[])])]))
|
||||
time.sleep(bst)
|
||||
cur_execute_fetchall('delete from config_conf where room=%s',(jid,))
|
||||
for tmp in raw_back['bot_config']: cur_execute('insert into config_conf (room, option ,value) values (%s,%s,%s)',(jid,tmp[0],tmp[1]))
|
||||
for tmp in raw_back['alias']:
|
||||
cur_execute('delete from alias where room=%s and match =%s',(jid,tmp[0]))
|
||||
cur_execute('insert into alias (room, match ,cmd) values (%s,%s,%s)',(jid,tmp[0],tmp[1]))
|
||||
for tmp in raw_back['acl']:
|
||||
isit = cur_execute_fetchall('select action,type,text,command,time from acl where jid=%s and action=%s and type=%s and text=%s and level=%s',(jid,tmp[0],tmp[1],tmp[2],tmp[5]))
|
||||
if not isit: cur_execute('insert into acl values (%s,%s,%s,%s,%s,%s,%s)', tuple([jid]+list(tmp)))
|
||||
for tmp in raw_back['rss']:
|
||||
isit = cur_execute_fetchone('select * from feed where room=%s and url=%s',(jid,tmp[0]))
|
||||
if not isit: cur_execute('insert into feeed (url, update ,type,time,room,hash) values (%s,%s,%s,%s,%s,%s)',(tmp[0],tmp[1],tmp[2],tmp[3],jid,tmp[4]))
|
||||
msg = L('Restore completed.','%s/%s'%(jid,nick))
|
||||
msg += L('\nOwners: %s | Admins: %s | Members: %s | Banned: %s','%s/%s'%(jid,nick)) % (\
|
||||
len(raw_back['owner'])-1,\
|
||||
len(raw_back['admin'])+1,\
|
||||
len(raw_back['member']),\
|
||||
len(raw_back['outcast']))
|
||||
|
||||
msg += L('\nRoom config: %s | Bot config: %s | Aliases: %s | Acl\'s: %s | RSS: %s','%s/%s'%(jid,nick)) % (\
|
||||
len(raw_back['room_config']),\
|
||||
len(raw_back['bot_config']),\
|
||||
len(raw_back['alias']),\
|
||||
len(raw_back['acl']),\
|
||||
len(raw_back['rss']))
|
||||
else: msg = L('Copy not found. Use key "show" for lisen available copies.','%s/%s'%(jid,nick))
|
||||
else: msg = L('What do you want to restore?','%s/%s'%(jid,nick))
|
||||
else: msg = L('Unknown item!','%s/%s'%(jid,nick))
|
||||
else: msg = 'backup now|show|restore'
|
||||
send_msg(type, jid, nick, msg)
|
||||
|
||||
global execute
|
||||
|
||||
execute = [(8, 'backup', conf_backup, 2, 'Backup/restore conference settings.\nbackup show|now|restore\nshow - show available copies\nnow - backup current conference\nrestore name_conference - restore settings name_conference in current conference')]
|
||||
Reference in New Issue
Block a user