add: initial AI support
This commit is contained in:
271
plugins/karma.py
Normal file
271
plugins/karma.py
Normal file
@@ -0,0 +1,271 @@
|
||||
#!/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/>. #
|
||||
# #
|
||||
# --------------------------------------------------------------------------- #
|
||||
|
||||
last_karma = {}
|
||||
|
||||
def karma(type, jid, nick, text):
|
||||
arg = text.split(' ',1)
|
||||
try: arg1 = arg[1]
|
||||
except: arg1 = None
|
||||
a0l = arg[0].lower()
|
||||
|
||||
karma_comm = {'show': [karma_show, (jid, nick, arg1)],
|
||||
'top+': [karma_top, (jid, nick, arg1, None)],
|
||||
'top-': [karma_top, (jid, nick, arg1, True)],
|
||||
'set': [karma_set, (jid, nick, arg1)],
|
||||
'clear': [karma_clear, (jid, nick, arg1)]}
|
||||
|
||||
if karma_comm.has_key(a0l): msg = karma_comm[a0l][0](*karma_comm[a0l][1])
|
||||
else: msg = karma_show(jid, nick, text)
|
||||
send_msg(type, jid, nick, msg)
|
||||
|
||||
def karma_top(jid, nick, text, order):
|
||||
try: lim = int(text)
|
||||
except: lim = GT('karma_show_default_limit')
|
||||
if lim < 1: lim = 1
|
||||
elif lim > GT('karma_show_max_limit'): lim = GT('karma_show_max_limit')
|
||||
if order: stat = cur_execute_fetchall('select jid,karma from karma where room=%s order by karma',(jid,))
|
||||
else: stat = cur_execute_fetchall('select jid,karma from karma where room=%s order by -karma',(jid,))
|
||||
if stat == None: return L('In this room karma is not changed!','%s/%s'%(jid,nick))
|
||||
msg, cnt = '', 1
|
||||
for tmp in stat:
|
||||
tmp2 = get_nick_by_jid(jid, tmp[0])
|
||||
if tmp2:
|
||||
msg += '\n%s. %s\t%s' % (cnt,tmp2,karma_val(int(tmp[1])))
|
||||
cnt += 1
|
||||
if cnt > lim: break
|
||||
if len(msg): return L('Top karma: %s','%s/%s'%(jid,nick)) % msg
|
||||
else: return L('Karma for members is present not changed!','%s/%s'%(jid,nick))
|
||||
|
||||
def karma_size_wrong(room):
|
||||
k_size = int(config_prefs['karma_limit_size'][3])
|
||||
put_config(jid,'karma_limit_size',k_size)
|
||||
return k_size
|
||||
|
||||
def karma_get_limit(room,nick):
|
||||
room = getRoom(room)
|
||||
(acclvl, jid) = get_level(room,nick)
|
||||
if acclvl >= 7: return -1,-1
|
||||
k_log = cur_execute_fetchone('select log from karma_limits where room=%s and jid=%s',(room,getRoom(jid)))
|
||||
k_size = get_config(room,'karma_limit_size')
|
||||
if ''.join(re.findall('[-0-9, []]*', k_size)) != k_size: k_size = karma_size_wrong(room)
|
||||
if len(json.loads(k_size)) != 2: k_size = karma_size_wrong(room)
|
||||
k_size = json.loads(k_size)
|
||||
k_limit = [k_size[0],k_size[1]][acclvl >= 4]
|
||||
k_val = k_limit
|
||||
if k_log:
|
||||
k_log = json.loads(k_log[0])
|
||||
for tmp in k_log:
|
||||
if (time.time() - tmp) < 86400: k_val -= 1
|
||||
k_log.sort()
|
||||
else: k_log = [0]
|
||||
return k_val, k_limit, k_log[0]
|
||||
|
||||
def karma_show(jid, nick, text):
|
||||
if text == None or text == '' or text == nick: text, atext = nick, L('Your','%s/%s'%(jid,nick))
|
||||
else: atext = text
|
||||
karmajid = getRoom(get_level(jid,text)[1])
|
||||
if karmajid == 'None': return L('I\'m not sure, but %s not is here.','%s/%s'%(jid,nick)) % atext
|
||||
else:
|
||||
lim_text = ''
|
||||
if get_config(getRoom(jid),'karma_limit'):
|
||||
k_val = karma_get_limit(jid,text)[0]
|
||||
if k_val >= 0: lim_text = '. ' + L('Karma limit is %s','%s/%s'%(jid,nick)) % k_val
|
||||
stat = cur_execute_fetchone('select karma from karma where room=%s and jid=%s',(jid,karmajid))
|
||||
if stat == None: return L('%s have a clear karma','%s/%s'%(jid,nick)) % atext + lim_text
|
||||
else: return L('%s karma is %s','%s/%s'%(jid,nick)) % (atext, karma_val(int(stat[0]))) + lim_text
|
||||
|
||||
def karma_set(jid, nick, text):
|
||||
if cur_execute_fetchone('select * from commonoff where room=%s and cmd=%s',(jid,'karma')): return
|
||||
k_acc = get_level(jid,nick)[0]
|
||||
try:
|
||||
if '\n' in text: text,val = text.split('\n',1)
|
||||
else: text,val = text.split(' ',1)
|
||||
if k_acc >= 9:
|
||||
val = int(val)
|
||||
jid, karmajid = getRoom(jid), getRoom(get_level(jid,text)[1])
|
||||
if karmajid == getRoom(selfjid): return
|
||||
elif karmajid == 'None': return L('You can\'t change karma in outdoor conference!','%s/%s'%(jid,nick))
|
||||
else:
|
||||
cur_execute('delete from karma where room=%s and jid=%s',(jid,karmajid))
|
||||
cur_execute('insert into karma values (%s,%s,%s)',(jid,karmajid,val))
|
||||
val = karma_val(val)
|
||||
return L('You changes %s\'s karma to %s','%s/%s'%(jid,nick)) % (text,val)
|
||||
else: return L('You can\'t change karma!','%s/%s'%(jid,nick))
|
||||
except: return L('incorrect digital parameter','%s/%s'%(jid,nick)).capitalize()
|
||||
|
||||
def karma_clear(jid, nick, text):
|
||||
if cur_execute_fetchone('select * from commonoff where room=%s and cmd=%s',(jid,'karma')): return
|
||||
k_acc = get_level(jid,nick)[0]
|
||||
if k_acc >= 9:
|
||||
if '\n' in text: (param,text) = text.split('\n',1)
|
||||
else: param = ''
|
||||
jid, karmajid = getRoom(jid), getRoom(get_level(jid,text)[1])
|
||||
if karmajid == getRoom(selfjid): return
|
||||
elif karmajid == 'None': return L('You can\'t change karma in outdoor conference!','%s/%s'%(jid,nick))
|
||||
else:
|
||||
if param in ['','all','karma','limits']:
|
||||
if param in ['','all','karma']: cur_execute('delete from karma where room=%s and jid=%s',(jid,karmajid))
|
||||
if param in ['all','limits']: cur_execute('delete from karma_limits where room=%s and jid=%s',(jid,karmajid))
|
||||
return L('You clear karma for %s','%s/%s'%(jid,nick)) % text
|
||||
else: return L('Wrong arguments!','%s/%s'%(jid,nick))
|
||||
else: return L('You can\'t change karma!','%s/%s'%(jid,nick))
|
||||
|
||||
def karma_get_access(room,jid):
|
||||
stat = cur_execute_fetchone('select karma from karma where room=%s and jid=%s',(room,jid))
|
||||
if stat == None: return None
|
||||
if int(stat[0]) < GT('karma_limit'): return None
|
||||
return True
|
||||
|
||||
def karma_val(val): return ['%+2d' % val,'0'][val==0]
|
||||
|
||||
def karma_correct(room):
|
||||
def karma_correct_diff(vm,ac):
|
||||
lim_up = [GT('karma_discret_lim_up')]
|
||||
lim_dn = [GT('karma_discret_lim_dn')]
|
||||
kd,rs = GT('karma_discret'),[]
|
||||
def validate_mass(m):
|
||||
for t in range(0,len(m)-1):
|
||||
if abs(m[t]-m[t+1]) < kd or m[t] >= m[t+1]: return False
|
||||
return True
|
||||
def karma_blur_mass(vm):
|
||||
vm = lim_dn + vm + lim_up
|
||||
nm = []
|
||||
for t in range(0,len(vm)-2): nm.append(int((vm[t]+vm[t+1]+vm[t+2])/3))
|
||||
return nm
|
||||
while not validate_mass(vm): vm = karma_blur_mass(vm)
|
||||
for t in range(0,len(ac)): rs.append([vm[t],ac[t]])
|
||||
return rs
|
||||
tm,ac,vm,nm = config_group_karma[2],[],[],[]
|
||||
for t in tm:
|
||||
df = re.findall(r'karma_action_[0-9](.*)',t)
|
||||
if df:
|
||||
ac += df
|
||||
tvm = get_config_int(room,t)
|
||||
vm.append(tvm)
|
||||
nm.append(t)
|
||||
vm = karma_correct_diff(vm,ac)
|
||||
for t in range(0,len(nm)): put_config(room,nm[t],str(vm[t][0]))
|
||||
return vm
|
||||
|
||||
def karma_action_do(room,text,action):
|
||||
nick = getResourse(cur_execute_fetchone('select room from conference where room ilike %s',('%s/%%'%room,))[0])
|
||||
action = action.replace('ban','outcast')
|
||||
act = {'outcast':muc_affiliation,'none':muc_affiliation,'member':muc_affiliation,
|
||||
'kick':muc_role,'participant':muc_role,'visitor':muc_role,'moderator':muc_role}
|
||||
act[action]('chat',room,nick,'%s\n%s' % (text,get_config(room,'karma_action_reason')),action.replace('kick','none'),0)
|
||||
|
||||
def karma_change(room,jid,nick,type,text,value):
|
||||
global last_karma
|
||||
if type == 'chat': msg = L('You can\'t change karma in private!','%s/%s'%(room,nick))
|
||||
else:
|
||||
last_karma_text = last_karma.pop('%s/%s' % (room,jid), None)
|
||||
if last_karma_text:
|
||||
karma_text, karma_count = last_karma_text
|
||||
last_karma['%s/%s' % (room,jid)] = (karma_text, karma_count + 1)
|
||||
if karma_text == text and karma_count >= 2: return
|
||||
else: last_karma['%s/%s' % (room,jid)] = (text, 1)
|
||||
if cur_execute_fetchone('select * from commonoff where room=%s and cmd=%s',(room,'karma')): return
|
||||
if ': ' in text: (text,other) = text.split(': ',1)
|
||||
elif ', ' in text: (text,other) = text.split(', ',1)
|
||||
else: return
|
||||
if len(other) > 2 and get_config(getRoom(room),'karma_hard'): return
|
||||
k_acc = get_level(room,nick)[0]
|
||||
if k_acc < 0: return
|
||||
if k_acc >= 4 or karma_get_access(room,getRoom(jid)):
|
||||
jid, karmajid = getRoom(jid), getRoom(get_level(room,text)[1])
|
||||
if karmajid == getRoom(selfjid): return
|
||||
elif karmajid == 'None': msg = L('You can\'t change karma in outdoor conference!','%s/%s'%(room,nick))
|
||||
elif karmajid == jid: msg = L('You can\'t change own karma!','%s/%s'%(room,nick))
|
||||
elif get_config(getRoom(jid),'karma_limit') and karma_get_limit(room,nick)[0] == 0: msg = L('Karma limit is %s','%s/%s'%(room,nick)) % L('over','%s/%s'%(room,nick)) + '. ' + L('Please wait: %s','%s/%s'%(room,nick)) % un_unix(int(86400-(time.time() - karma_get_limit(room,nick)[2])),'%s/%s'%(room,nick))
|
||||
else:
|
||||
stat = cur_execute_fetchone('select last from karma_commiters where room=%s and jid=%s and karmajid=%s',(room,jid,karmajid))
|
||||
karma_valid, karma_time = None, int(time.time())
|
||||
if stat == None: karma_valid = True
|
||||
elif karma_time - int(stat[0]) >= GT('karma_timeout')[k_acc]: karma_valid = True
|
||||
if karma_valid:
|
||||
if k_acc < 7:
|
||||
k_log = cur_execute_fetchone('select log from karma_limits where room=%s and jid=%s',(room,jid))
|
||||
k_size = get_config(room,'karma_limit_size')
|
||||
if ''.join(re.findall('[-0-9, []]*', k_size)) != k_size: k_size = karma_size_wrong(room)
|
||||
if len(json.loads(k_size)) != 2: k_size = karma_size_wrong(room)
|
||||
k_size = json.loads(k_size)
|
||||
k_limit = [k_size[0],k_size[1]][k_acc >= 4]
|
||||
k_val = k_limit
|
||||
if k_log:
|
||||
k_log = json.loads(k_log[0])
|
||||
for tmp in k_log:
|
||||
if time.time() - tmp < 86400: k_val -= 1
|
||||
k_log = str([karma_time] + k_log[:k_limit-1])
|
||||
cur_execute('update karma_limits set log=%s where room=%s and jid=%s',(k_log,room,jid))
|
||||
else: cur_execute('insert into karma_limits values (%s,%s,%s)',(room,jid,'[%s]' % karma_time))
|
||||
if stat: cur_execute('update karma_commiters set last=%s where room=%s and jid=%s and karmajid=%s',(karma_time,room,jid,karmajid))
|
||||
else: cur_execute('insert into karma_commiters values (%s,%s,%s,%s)',(room,jid,karmajid,karma_time))
|
||||
stat = cur_execute_fetchone('select karma from karma where room=%s and jid=%s',(room,karmajid))
|
||||
if stat:
|
||||
stat = stat[0]+value
|
||||
cur_execute('delete from karma where room=%s and jid=%s',(room,karmajid))
|
||||
else: stat = value
|
||||
cur_execute('insert into karma values (%s,%s,%s)',(room,karmajid,stat))
|
||||
msg = L('You changes %s\'s karma to %s. Next time to change across: %s','%s/%s'%(room,nick)) % (text,karma_val(stat),un_unix(GT('karma_timeout')[k_acc],'%s/%s'%(room,nick)))
|
||||
pprint('karma change in %s for %s to %s' % (room,text,stat),'green')
|
||||
am = None
|
||||
if get_config(room,'karma_action'):
|
||||
kmass = karma_correct(room)
|
||||
for t in kmass:
|
||||
if t[0] <= 0 and stat <= t[0]:
|
||||
am = (room,text,t[1])
|
||||
break
|
||||
elif t[0] > 0 and stat >= t[0]: am = (room,text,t[1])
|
||||
if am:
|
||||
karma_action_do(*am)
|
||||
pprint('karma action in %s for %s is %s' % am,'bright_green')
|
||||
else: msg = L('Time from last change %s\'s karma is very small. Please wait %s','%s/%s'%(room,nick)) % (text,un_unix(int(stat[0])+GT('karma_timeout')[k_acc]-karma_time,'%s/%s'%(room,nick)))
|
||||
if get_config(room,'karma_limit'):
|
||||
k_val = karma_get_limit(room,nick)[0]
|
||||
if k_val >= 0: msg += '. ' + L('Karma limit is %s','%s/%s'%(room,nick)) % [L('over','%s/%s'%(room,nick)), k_val][k_val > 0]
|
||||
else: msg = L('You can\'t change karma!','%s/%s'%(room,nick))
|
||||
send_msg(type, room, nick, msg)
|
||||
|
||||
def karma_check(room,jid,nick,type,text):
|
||||
if getRoom(jid) == getRoom(selfjid): return
|
||||
if len(unicode(text)) < 5: return
|
||||
while len(text) and text[-1:] == ' ': text = text[:-1]
|
||||
if text[-3:] == ' +1':
|
||||
karma_change(room,jid,nick,type,text,1)
|
||||
return True
|
||||
elif text[-3:] == ' -1':
|
||||
karma_change(room,jid,nick,type,text,-1)
|
||||
return True
|
||||
|
||||
def karma_clear_log(room,jid,nick,type,arr):
|
||||
global last_karma
|
||||
if type == 'unavailable': last_karma.pop('%s/%s' % (room,jid), None)
|
||||
|
||||
global execute, message_control,presence_control
|
||||
|
||||
presence_control = [karma_clear_log]
|
||||
|
||||
message_act_control = [karma_check]
|
||||
|
||||
execute = [(3, 'karma', karma, 2, 'Karma.\nkarma [show] nick\nkarma top+|- [count]\nFor change karma: nick: +1\nnick: -1')]
|
||||
Reference in New Issue
Block a user