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

178 lines
8.4 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/>. #
# #
# --------------------------------------------------------------------------- #
bomb_colors = [L('blue'),L('red'),L('magenta'),L('green'),L('cyan'),L('yellow'),L('white'),L('black')]
bomb_current = {}
bomb_random_list = {}
bomb_random_timer_check_period = 10
bomb_random_sleep = 600
bomb_deny_access = [-1,9]
bomb_last_activity = {}
bomb_access_level = {}
def bomb_idle(jid,nick):
global idle_base
for tmp in idle_base:
if tmp[0] == jid and tmp[1] == nick:
bid = get_config_int(getRoom(jid),'bomb_idle')
if int(time.time())-tmp[3] >= bid: break
else: return False
return True
def boom_bomb(room,type,nick,bc,mode):
global bomb_access_level
b_fault = None
if get_config(getRoom(room),'bomb_fault'):
bfp = get_config_int(getRoom(room),'bomb_fault_persent')
if bfp < 0 or bfp > 100: bfp = int(config_prefs['bomb_fault_persent'][3])
b_fault = random.randint(0,100) < bfp
if b_fault: send_msg(type, room, nick, L('It\'s a lucky day for you! Bomb is fault! Right wide is %s','%s/%s'%(room,nick)) % bc)
else:
if mode: send_msg(type, room, nick, L('You were wrong! Right wire is %s','%s/%s'%(room,nick)) % bc)
try:
if get_config(getRoom(room),'bomb_action') == 'kick' and bomb_access_level.pop(room+nick) >= get_config_int(getRoom(room),'bomb_action_level'): muc_role(type, room, nick, '%s\n%s' % (nick,get_config(getRoom(room),'bomb_reason')), 'none',0)
except: pass
def get_next_random(room):
btm = get_config_int(room,'bomb_random_timer')
if btm < 0: btm = int(config_prefs['bomb_random_timer'][3])
btmp = get_config_int(room,'bomb_random_timer_persent')
if btmp <= 0 or btmp > 99: btmp = int(config_prefs['bomb_random_timer_persent'][3])
btm_pers = int(btm/100*btmp)
bskp = get_config_int(room,'bomb_random_timer_skip_persent')
if bskp <= 0 or bskp > 99: bskp = int(config_prefs['bomb_random_timer_skip_persent'][3])
if random.randint(0,100) > bskp: btm *= 2
return time.time() + btm + random.randint(-btm_pers,btm_pers)
def bomb_joke(type, jid, nick, text):
global bomb_current,bomb_random_list,bomb_access_level
if type == 'chat':
send_msg(type, jid, nick, L('Not allowed in private!','%s/%s'%(jid,nick)))
return
if len(text) == 0 or len(text) == text.count(' ')+text.count('\n'):
rlist,tconf = [],getRoom(jid)
for tm in megabase:
if tm[0] == tconf and not bomb_idle(jid,text) and not (get_level(tconf,tm[1])[0] in bomb_deny_access) and not (getRoom(get_level(tconf,tm[1])[1]) in ['None',getRoom(selfjid)]): rlist.append(tm[1])
if len(rlist): text = rlist[random.randrange(len(rlist))]
else:
if not (nick == text == ''): send_msg(type, jid, nick, L('Here is no candidate to take a bomb!','%s/%s'%(jid,nick)))
return
bmb = False
if not get_config(getRoom(jid),'bomb'): msg = L('In this room not allowed take a bomb!','%s/%s'%(jid,nick))
elif jid in bomb_current.keys(): msg = L('This room alredy boombed!','%s/%s'%(jid,nick))
elif bomb_idle(jid,text) or get_level(jid,text)[0] in bomb_deny_access or getRoom(get_level(jid,text)[1]) in ['None',getRoom(selfjid)]: msg = L('I can\'t take a bomb to %s','%s/%s'%(jid,nick)) % text
else:
bomb_access_level[jid+text] = get_level(jid,nick)[0]
b_timer = get_config_int(getRoom(jid),'bomb_timer')
if b_timer < 0: b_timer = (config_prefs['bomb_timer'][3])
b_wire = get_config_int(getRoom(jid),'bomb_wire')
if b_wire < 3 or b_wire > len(bomb_colors): b_wire = int(config_prefs['bomb_wire'][3])
b_clrs = []
while len(b_clrs) < b_wire:
bc = bomb_colors[random.randrange(len(bomb_colors))]
if bc not in b_clrs: b_clrs.append(bc)
bomb_current[getRoom(jid)] = [text,b_clrs,b_clrs[random.randrange(len(b_clrs))]]
msg,bmb = L('/me take a bomb to %s with wires %s. Time to deactivate is %s sec.','%s/%s'%(jid,nick)) % (text,', '.join(b_clrs),b_timer),True
send_msg(type, jid, '', msg)
if bmb:
while b_timer > 0 and not game_over:
time.sleep(1)
b_timer -= 1
if jid not in bomb_current.keys(): break
if b_timer <= 0 and not game_over:
if bomb_current.has_key(getRoom(jid)): bc = bomb_current.pop(getRoom(jid))
else: bc = L('unknown','%s/%s'%(jid,nick))
b_fault = None
if get_config(getRoom(jid),'bomb_fault'):
bfp = get_config_int(getRoom(jid),'bomb_fault_persent')
if bfp < 0 or bfp > 100: bfp = int(config_prefs['bomb_fault_persent'][3])
b_fault = random.randint(0,100) < bfp
if b_fault: send_msg(type, jid, text, L('It\'s a lucky day for you! Bomb is fault! Right wide is %s','%s/%s'%(jid,nick)) % bc[2])
else:
send_msg(type, jid, '', L('/me explode %s','%s/%s'%(jid,nick)) % text)
if get_config(getRoom(jid),'bomb_action') == 'kick' and bomb_access_level.pop(jid+text) >= get_config_int(getRoom(jid),'bomb_action_level'): muc_role(type, jid, nick, '%s\n%s' % (text,get_config(getRoom(jid),'bomb_reason')), 'none',0)
bomb_random_list[getRoom(jid)] = get_next_random(getRoom(jid))
def bomb_presence(room,jid,nick,type,mass):
global bomb_current
if not get_config(getRoom(room),'bomb'): return
try: bc = bomb_current[getRoom(room)]
except: return
if nick != bc[0]: return
if type == 'unavailable':
if bomb_current.has_key(getRoom(room)): bc = bomb_current.pop(getRoom(room))
else: bc = L('unknown','%s/%s'%(room,nick))
if mass[8]:
time.sleep(1)
boom_bomb(room,'groupchat',mass[8],bc[2],None)
bomb_random_list[getRoom(room)] = get_next_random(getRoom(room))
def bomb_message(room,jid,nick,type,text):
global bomb_current,bomb_random_list
gr = getRoom(room)
if not get_config(gr,'bomb'): return
try: bc = bomb_current[gr]
except: return
if nick != bc[0]: return
if text.lower() not in bc[1]: return
if bomb_current.has_key(gr): bomb_current.pop(gr)
type = 'groupchat'
if text.lower() == bc[2]: send_msg(type, room, nick, L('Bomb is deactivated! Congratulations!','%s/%s'%(room,nick)))
else: boom_bomb(room,type,nick,bc[2],True)
bomb_random_list[gr] = get_next_random(gr)
def bomb_random():
global bomb_current,bomb_random_list
bt = bomb_random_sleep
while not game_over and bt > 0:
time.sleep(1)
bt -= 1
while not game_over:
ntime = time.time()
cb = [t[0] for t in cur_execute_fetchall("select split_part(room,'/',1) from conference;") if t]
for tmp in cb:
try: bla = get_config(tmp,'bomb_random_active') and (ntime - bomb_last_activity[tmp]) < get_config_int(tmp,'bomb_random_active_timer')
except: bla = True
if get_config(tmp,'bomb') and get_config(tmp,'bomb_random') and bla:
try: bsets = bomb_random_list[tmp]
except: bomb_random_list[tmp],bsets = ntime,ntime
if bsets < ntime:
bomb_joke('groupchat', tmp, '', '')
bomb_random_list[tmp] = get_next_random(tmp)
bt = bomb_random_timer_check_period
while not game_over and bt > 0:
time.sleep(1)
bt -= 1
def bomb_message_active(room,jid,nick,type,mass):
global bomb_last_activity
if jid != 'None': bomb_last_activity[getRoom(room)] = int(time.time())
global execute, presence_control, message_control
presence_control = [bomb_presence]
message_act_control = [bomb_message,bomb_message_active]
execute = [(4, 'bomb', bomb_joke, 2, 'Take a bomb joke!')]