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

134 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/>. #
# #
# --------------------------------------------------------------------------- #
# cron * * * * * \n command
def time_cron(type, jid, nick, text):
ar = text.split(' ',1)[0].lower()
try: par = text.split(' ',1)[1]
except: par = ''
if ar == 'show': msg = time_cron_show(jid,nick,par)
elif ar == 'del': msg = time_cron_del(jid,nick,par)
else: msg = time_cron_add(text,jid,nick)
send_msg(type, jid, nick, msg)
def time_cron_show(jid,nick,ar):
al = get_level(jid,nick)[0]
if ar:
if al == 9 and ar.lower().split()[0] in ['all','global','total']: room = '%'
else: room = jid
else: room = jid
c = cur_execute_fetchall('select * from cron where room ilike %s order by room, time',(room,))
if c:
tmp, idx = [], 1
for t in c:
if t[2] == '\n': mode = '[silent]'
elif not t[2]: mode = '[anonim]'
else: mode = ''
if room=='%': msg = '%s|%s' % (t[0],disp_time(t[3],'%s/%s'%(jid,nick)))
else: msg = '%s. %s' % (idx,disp_time(t[3],'%s/%s'%(jid,nick)))
if mode: msg = '%s %s' % (msg,mode)
if t[4]: msg += ' [%s]' % t[4]
msg += ' -> %s' % t[5]
tmp.append(msg)
idx += 1
return L('Cron rules:\n%s','%s/%s'%(jid,nick)) % '\n'.join(tmp)
else: return L('There is no cron rules.','%s/%s'%(jid,nick))
def time_cron_add(ar,jid,nick):
try: cron_time, cron_cmd = ar.split('\n',1)
except: return L('Not enough parameters!','%s/%s'%(jid,nick))
try:
SM,RM,NM = 'silent','once','anonim'
CMD = [SM,RM,NM]
ct = cron_time.lower().split()
rm,sm,nm = RM in ct,SM in ct,NM in ct
if rm or sm or nm:
for t in CMD:
try: ct.remove(t)
except: pass
ct = ' '.join(ct)
if rm: cron_time,repeat_time = ct,''
else: cron_time,repeat_time = ct,ct
next_time = crontab.CronTab(cron_time).next() + time.time()
except: return L('Error in time format!','%s/%s'%(jid,nick))
lvl,rj = get_level(jid,nick)
amm,tcmd = -1,cron_cmd.split(' ')[0]
for tmp in comms:
if tmp[1] == tcmd:
amm = tmp[0]
break
if amm < 0: return L('Command not found: %s','%s/%s'%(jid,nick)) % tcmd
elif amm > lvl: return L('Not allowed launch: %s','%s/%s'%(jid,nick)) % tcmd
else:
if sm: nick = '\n'
elif nm: nick = ''
cur_execute('insert into cron values (%s,%s,%s,%s,%s,%s,%s)', (jid,getRoom(rj),nick,next_time,repeat_time,cron_cmd,lvl))
return '%s -> %s' % (disp_time(next_time,'%s/%s'%(jid,nick)),cron_cmd)
def time_cron_del(jid,nick,ar):
al = get_level(jid,nick)[0]
if al == 9 and ar.lower() == 'all':
cur_execute('delete from cron where room=%s',(jid,))
return L('All cron rules removed!','%s/%s'%(jid,nick))
elif not ar: return L('Need choise record number.','%s/%s'%(jid,nick))
elif not ar.isdigit(): return L('Record ID is numeric.','%s/%s'%(jid,nick))
else:
c = cur_execute_fetchall('select * from cron where room ilike %s order by room, time',(jid,))
try: rec = c[int(ar)-1]
except: return L('Record #%s not found!','%s/%s'%(jid,nick)) % ar
cur_execute('delete from cron where room=%s and jid=%s and nick=%s and time=%s and repeat=%s and command=%s and level=%s',rec)
msg = disp_time(rec[3],'%s/%s'%(jid,nick))
if rec[2] == '\n': mode = '[silent]'
elif not rec[2]: mode = '[anonim]'
else: mode = ''
if mode: msg = '%s %s' % (msg,mode)
if rec[4]: msg += ' [%s]' % rec[4]
msg += ' -> %s' % rec[5]
return L('Removed: %s','%s/%s'%(jid,nick)) % msg
def cron_action():
itt = int(time.time())
c = cur_execute_fetchall('select distinct * from cron where %s >= time',(itt,))
if c:
cur_execute('delete from cron where %s >= time',(itt,))
for t in c:
if t[4]:
tm = crontab.CronTab(t[4]).next() + time.time()
m = list(t[:3]) + [tm] + list(t[4:7])
cur_execute('insert into cron values (%s,%s,%s,%s,%s,%s,%s)', m)
tmp = cur_execute_fetchone('select room from conference where room ilike %s',('%s/%%'%t[0],))
if not tmp:
pprint('Can\'t execute by cron: %s in %s' % (t[5].split()[0],t[0]),'red')
return
else: nowname = getResourse(tmp[0])
if t[2] == '\n': tmp_nick,tmp_type = '%s_cron_%d' % (nowname,time.time()),'chat'
else: tmp_nick,tmp_type = t[2],'groupchat'
com_parser(t[6], nowname, tmp_type, t[0], tmp_nick, t[5], Settings['jid'])
global execute, timer
timer = [cron_action]
execute = [(7, 'cron', time_cron, 2, 'Execute command by cron. Used unix-type time format.\ncron [once] [anonim|silent] * * * * *\ncommand')]