2012-04-09 02:19:39 +00:00
# coding=utf-8
2012-07-03 02:13:10 +00:00
import imp
2012-04-09 02:19:39 +00:00
import re
2012-04-11 15:33:57 +00:00
import sys
2012-04-09 02:19:39 +00:00
from datetime import timedelta
2012-06-29 18:23:29 +00:00
from datetime import datetime
2012-04-30 16:22:10 +00:00
import time
2012-05-14 15:50:11 +00:00
import threading
2012-08-30 23:54:57 +00:00
import traceback
2012-04-09 02:19:39 +00:00
2012-11-04 14:32:39 +00:00
nemubotversion = 3.3
2012-05-20 07:44:07 +00:00
2012-08-16 02:34:22 +00:00
from event import ModuleEvent
from hooks import Hook
2012-06-29 17:20:29 +00:00
2012-06-20 14:24:19 +00:00
def help_tiny ( ) :
2012-11-04 14:32:39 +00:00
""" Line inserted in the response to the command !help """
return " events manager "
2012-06-20 14:24:19 +00:00
def help_full ( ) :
2012-11-04 14:32:39 +00:00
return " This module store a lot of events: ny, we, vacs, " + ( " , " . join ( DATAS . index . keys ( ) ) ) + " \n !eventslist: gets list of timer \n !start /something/: launch a timer "
2012-05-14 15:50:11 +00:00
2012-08-16 02:34:22 +00:00
CONTEXT = None
def load ( context ) :
global DATAS , CONTEXT
CONTEXT = context
#Define the index
DATAS . setIndex ( " name " )
for evt in DATAS . index . keys ( ) :
if DATAS . index [ evt ] . hasAttribute ( " end " ) :
event = ModuleEvent ( call = fini , call_data = dict ( strend = DATAS . index [ evt ] ) )
event . end = DATAS . index [ evt ] . getDate ( " end " )
2012-09-02 16:40:44 +00:00
idt = context . add_event ( event )
if idt is not None :
DATAS . index [ evt ] [ " id " ] = idt
2012-08-30 23:54:57 +00:00
2012-08-16 02:34:22 +00:00
2012-09-02 16:40:44 +00:00
def fini ( d , strend ) :
2012-08-16 02:34:22 +00:00
for server in CONTEXT . servers . keys ( ) :
if not strend . hasAttribute ( " server " ) or server == strend [ " server " ] :
if strend [ " channel " ] == CONTEXT . servers [ server ] . nick :
2012-08-30 23:54:57 +00:00
CONTEXT . servers [ server ] . send_msg_usr ( strend [ " sender " ] , " %s : %s arrivé à échéance. " % ( strend [ " proprio " ] , strend [ " name " ] ) )
2012-08-16 02:34:22 +00:00
else :
CONTEXT . servers [ server ] . send_msg ( strend [ " channel " ] , " %s : %s arrivé à échéance. " % ( strend [ " proprio " ] , strend [ " name " ] ) )
DATAS . delChild ( DATAS . index [ strend [ " name " ] ] )
save ( )
2012-05-14 15:50:11 +00:00
2012-11-01 08:30:00 +00:00
def cmd_gouter ( msg ) :
ndate = datetime . today ( )
ndate = datetime ( ndate . year , ndate . month , ndate . day , 16 , 42 )
return Response ( msg . sender ,
msg . countdown_format ( ndate ,
" Le goûter aura lieu dans %s , préparez vos biscuits ! " ,
" Nous avons %s de retard pour le goûter :( " ) ,
channel = msg . channel )
2012-08-22 19:05:33 +00:00
def cmd_we ( msg ) :
2012-04-09 02:19:39 +00:00
ndate = datetime . today ( ) + timedelta ( 5 - datetime . today ( ) . weekday ( ) )
ndate = datetime ( ndate . year , ndate . month , ndate . day , 0 , 0 , 1 )
2012-08-30 23:54:57 +00:00
return Response ( msg . sender ,
msg . countdown_format ( ndate ,
" Il reste %s avant le week-end, courage ;) " ,
" Youhou, on est en week-end depuis %s . " ) ,
channel = msg . channel )
2012-08-16 02:34:22 +00:00
2012-08-22 19:05:33 +00:00
def cmd_vacances ( msg ) :
2012-08-30 23:54:57 +00:00
return Response ( msg . sender ,
msg . countdown_format ( datetime ( 2013 , 7 , 30 , 18 , 0 , 1 ) ,
" Il reste %s avant les vacances :) " ,
" Profitons, c ' est les vacances depuis %s . " ) ,
channel = msg . channel )
2012-08-16 02:34:22 +00:00
2012-08-22 19:05:33 +00:00
def start_countdown ( msg ) :
2012-11-04 14:32:39 +00:00
if msg . cmds [ 1 ] not in DATAS . index :
2012-08-16 02:34:22 +00:00
strnd = ModuleState ( " strend " )
2012-11-04 14:32:39 +00:00
strnd [ " server " ] = msg . server
2012-08-16 02:34:22 +00:00
strnd [ " channel " ] = msg . channel
strnd [ " proprio " ] = msg . nick
2012-08-30 23:54:57 +00:00
strnd [ " sender " ] = msg . sender
2012-08-16 02:34:22 +00:00
strnd [ " start " ] = datetime . now ( )
2012-11-04 14:32:39 +00:00
strnd [ " name " ] = msg . cmds [ 1 ]
2012-08-16 02:34:22 +00:00
DATAS . addChild ( strnd )
evt = ModuleEvent ( call = fini , call_data = dict ( strend = strnd ) )
2012-11-04 14:32:39 +00:00
if len ( msg . cmds ) > 2 :
2012-12-07 23:10:38 +00:00
result1 = re . findall ( " ([0-9]+)([smhdjwyaSMHDJWYA])? " , msg . cmds [ 2 ] )
result2 = re . match ( " (.*[^0-9])?([0-3]?[0-9])/([0-1]?[0-9])/((19|20)?[01239][0-9]) " , msg . cmds [ 2 ] )
result3 = re . match ( " (.*[^0-9])?([0-2]?[0-9]):([0-5]?[0-9])(:([0-5]?[0-9]))? " , msg . cmds [ 2 ] )
2012-10-14 22:44:51 +00:00
if result2 is not None or result3 is not None :
2012-08-16 02:34:22 +00:00
try :
2012-10-14 22:44:51 +00:00
now = datetime . now ( )
2012-12-07 23:10:38 +00:00
if result3 is None or result3 . group ( 5 ) is None : sec = 0
else : sec = int ( result3 . group ( 5 ) )
if result3 is None or result3 . group ( 3 ) is None : minu = 0
else : minu = int ( result3 . group ( 3 ) )
if result3 is None or result3 . group ( 2 ) is None : hou = 0
else : hou = int ( result3 . group ( 2 ) )
2012-10-14 22:44:51 +00:00
2012-12-07 23:10:38 +00:00
if result2 is None or result2 . group ( 4 ) is None : yea = now . year
else : yea = int ( result2 . group ( 4 ) )
2012-10-14 22:44:51 +00:00
if result2 is not None and result3 is not None :
2012-12-07 23:10:38 +00:00
strnd [ " end " ] = datetime ( yea , int ( result2 . group ( 3 ) ) , int ( result2 . group ( 2 ) ) , hou , minu , sec )
2012-10-14 22:44:51 +00:00
elif result2 is not None :
2012-12-07 23:10:38 +00:00
strnd [ " end " ] = datetime ( int ( result2 . group ( 4 ) ) , int ( result2 . group ( 3 ) ) , int ( result2 . group ( 2 ) ) )
2012-10-14 22:44:51 +00:00
elif result3 is not None :
2012-11-01 08:30:00 +00:00
if hou * 3600 + minu * 60 + sec > now . hour * 3600 + now . minute * 60 + now . second :
strnd [ " end " ] = datetime ( now . year , now . month , now . day , hou , minu , sec )
else :
strnd [ " end " ] = datetime ( now . year , now . month , now . day + 1 , hou , minu , sec )
2012-10-14 22:44:51 +00:00
2012-08-16 02:34:22 +00:00
evt . end = strnd . getDate ( " end " )
2012-08-30 23:54:57 +00:00
strnd [ " id " ] = CONTEXT . add_event ( evt )
save ( )
2012-10-14 22:44:51 +00:00
return Response ( msg . sender , " %s commencé le %s et se terminera le %s . " %
2012-11-04 14:32:39 +00:00
( msg . cmds [ 1 ] , datetime . now ( ) . strftime ( " % A %d % B % Y a % H: % M: % S " ) ,
2012-10-14 22:44:51 +00:00
strnd . getDate ( " end " ) . strftime ( " % A %d % B % Y a % H: % M: % S " ) ) )
2012-08-16 02:34:22 +00:00
except :
2012-10-14 22:44:51 +00:00
DATAS . delChild ( strnd )
return Response ( msg . sender ,
2012-11-04 14:32:39 +00:00
" Mauvais format de date pour l ' evenement %s . Il n ' a pas ete cree. " % msg . cmds [ 1 ] )
2012-10-14 22:44:51 +00:00
elif result1 is not None and len ( result1 ) > 0 :
strnd [ " end " ] = datetime . now ( )
for ( t , g ) in result1 :
2012-11-01 08:30:00 +00:00
if g is None or g == " " or g == " m " or g == " M " :
2012-10-14 22:44:51 +00:00
strnd [ " end " ] + = timedelta ( minutes = int ( t ) )
elif g == " h " or g == " H " :
strnd [ " end " ] + = timedelta ( hours = int ( t ) )
elif g == " d " or g == " D " or g == " j " or g == " J " :
strnd [ " end " ] + = timedelta ( days = int ( t ) )
2012-11-01 08:30:00 +00:00
elif g == " w " or g == " W " :
strnd [ " end " ] + = timedelta ( days = int ( t ) * 7 )
2012-12-07 23:10:38 +00:00
elif g == " y " or g == " Y " or g == " a " or g == " A " :
strnd [ " end " ] + = timedelta ( days = int ( t ) * 365 )
2012-10-14 22:44:51 +00:00
else :
strnd [ " end " ] + = timedelta ( seconds = int ( t ) )
evt . end = strnd . getDate ( " end " )
strnd [ " id " ] = CONTEXT . add_event ( evt )
save ( )
return Response ( msg . sender , " %s commencé le %s et se terminera le %s . " %
2012-11-04 14:32:39 +00:00
( msg . cmds [ 1 ] , datetime . now ( ) . strftime ( " % A %d % B % Y a % H: % M: % S " ) ,
2012-10-14 22:44:51 +00:00
strnd . getDate ( " end " ) . strftime ( " % A %d % B % Y a % H: % M: % S " ) ) )
2012-08-16 02:34:22 +00:00
save ( )
2012-11-04 14:32:39 +00:00
return Response ( msg . sender , " %s commencé le %s " % ( msg . cmds [ 1 ] ,
2012-10-14 22:44:51 +00:00
datetime . now ( ) . strftime ( " % A %d % B % Y a % H: % M: % S " ) ) )
2012-04-30 16:22:10 +00:00
else :
2012-11-04 14:32:39 +00:00
return Response ( msg . sender , " %s existe déjà. " % ( msg . cmds [ 1 ] ) )
2012-08-16 02:34:22 +00:00
2012-08-23 00:46:48 +00:00
def end_countdown ( msg ) :
2012-11-04 14:32:39 +00:00
if msg . cmds [ 1 ] in DATAS . index :
2012-08-30 23:54:57 +00:00
res = Response ( msg . sender ,
2012-11-04 14:32:39 +00:00
" %s a duré %s . " % ( msg . cmds [ 1 ] ,
msg . just_countdown ( datetime . now ( ) - DATAS . index [ msg . cmds [ 1 ] ] . getDate ( " start " ) ) ) ,
2012-08-30 23:54:57 +00:00
channel = msg . channel )
2012-11-04 14:32:39 +00:00
if DATAS . index [ msg . cmds [ 1 ] ] [ " proprio " ] == msg . nick or ( msg . cmds [ 0 ] == " forceend " and msg . is_owner ) :
CONTEXT . del_event ( DATAS . index [ msg . cmds [ 1 ] ] [ " id " ] )
DATAS . delChild ( DATAS . index [ msg . cmds [ 1 ] ] )
2012-08-16 02:34:22 +00:00
save ( )
else :
2012-11-04 14:32:39 +00:00
res . append_message ( " Vous ne pouvez pas terminer le compteur %s , créé par %s . " % ( msg . cmds [ 1 ] , DATAS . index [ msg . cmds [ 1 ] ] [ " proprio " ] ) )
2012-08-30 23:54:57 +00:00
return res
2012-04-30 16:22:10 +00:00
else :
2012-11-04 14:32:39 +00:00
return Response ( msg . sender , " %s n ' est pas un compteur connu. " % ( msg . cmds [ 1 ] ) )
2012-08-16 02:34:22 +00:00
2012-08-23 00:46:48 +00:00
def liste ( msg ) :
2012-06-20 14:24:19 +00:00
msg . send_snd ( " Compteurs connus : %s . " % " , " . join ( DATAS . index . keys ( ) ) )
2012-08-16 02:34:22 +00:00
2012-08-23 00:46:48 +00:00
def parseanswer ( msg ) :
2012-11-04 14:32:39 +00:00
if msg . cmds [ 0 ] in DATAS . index :
if DATAS . index [ msg . cmds [ 0 ] ] . name == " strend " :
if DATAS . index [ msg . cmds [ 0 ] ] . hasAttribute ( " end " ) :
return Response ( msg . sender , " %s commencé il y a %s et se terminera dans %s . " % ( msg . cmds [ 0 ] , msg . just_countdown ( datetime . now ( ) - DATAS . index [ msg . cmds [ 0 ] ] . getDate ( " start " ) ) , msg . just_countdown ( DATAS . index [ msg . cmds [ 0 ] ] . getDate ( " end " ) - datetime . now ( ) ) ) , channel = msg . channel )
2012-08-23 00:46:48 +00:00
else :
2012-11-04 14:32:39 +00:00
return Response ( msg . sender , " %s commencé il y a %s . " % ( msg . cmds [ 0 ] , msg . just_countdown ( datetime . now ( ) - DATAS . index [ msg . cmds [ 0 ] ] . getDate ( " start " ) ) ) , channel = msg . channel )
2012-08-16 02:34:22 +00:00
else :
2012-08-23 00:46:48 +00:00
save ( )
2012-11-04 14:32:39 +00:00
return Response ( msg . sender , msg . countdown_format ( DATAS . index [ msg . cmds [ 0 ] ] . getDate ( " start " ) , DATAS . index [ msg . cmds [ 0 ] ] [ " msg_before " ] , DATAS . index [ msg . cmds [ 0 ] ] [ " msg_after " ] ) , channel = msg . channel )
2012-04-09 02:19:39 +00:00
def parseask ( msg ) :
2012-08-23 00:46:48 +00:00
msgl = msg . content . lower ( )
2012-04-09 02:19:39 +00:00
if re . match ( " ^.*((create|new) +(a|an|a +new|an *other)? *(events?|commande?)|(nouvel(le)?|ajoute|cr[ée] { 1,3}) +(un)? *([eé]v[ée]nements?|commande?)).*$ " , msgl ) is not None :
name = re . match ( " ^.*!([^ \" ' @!]+).*$ " , msg . content )
2012-06-20 14:24:19 +00:00
if name is not None and name . group ( 1 ) not in DATAS . index :
2012-04-09 02:19:39 +00:00
texts = re . match ( " ^[^ \" ]*(avant|après|apres|before|after)?[^ \" ]* \" ([^ \" ]+) \" [^ \" ]*((avant|après|apres|before|after)?.* \" ([^ \" ]+) \" .*)?$ " , msg . content )
if texts is not None and texts . group ( 3 ) is not None :
extDate = msg . extractDate ( )
if extDate is None or extDate == " " :
2012-08-30 23:54:57 +00:00
return Response ( msg . sender , " La date de l ' événement est invalide... " , channel = msg . channel )
2012-04-09 02:19:39 +00:00
else :
if texts . group ( 1 ) is not None and ( texts . group ( 1 ) == " après " or texts . group ( 1 ) == " apres " or texts . group ( 1 ) == " after " ) :
msg_after = texts . group ( 2 )
msg_before = texts . group ( 5 )
if ( texts . group ( 4 ) is not None and ( texts . group ( 4 ) == " après " or texts . group ( 4 ) == " apres " or texts . group ( 4 ) == " after " ) ) or texts . group ( 1 ) is None :
msg_before = texts . group ( 2 )
msg_after = texts . group ( 5 )
if msg_before . find ( " %s " ) != - 1 and msg_after . find ( " %s " ) != - 1 :
2012-06-20 14:24:19 +00:00
evt = ModuleState ( " event " )
2012-11-04 14:32:39 +00:00
evt [ " server " ] = msg . server
2012-06-20 14:24:19 +00:00
evt [ " channel " ] = msg . channel
2012-07-23 10:07:26 +00:00
evt [ " proprio " ] = msg . nick
2012-08-30 23:54:57 +00:00
evt [ " sender " ] = msg . sender
2012-06-20 14:24:19 +00:00
evt [ " name " ] = name . group ( 1 )
evt [ " start " ] = extDate
evt [ " msg_after " ] = msg_after
evt [ " msg_before " ] = msg_before
DATAS . addChild ( evt )
save ( )
2012-08-30 23:54:57 +00:00
return Response ( msg . sender ,
" Nouvel événement ! %s ajouté avec succès. " % name . group ( 1 ) ,
msg . channel )
2012-04-09 02:19:39 +00:00
else :
2012-08-30 23:54:57 +00:00
return Response ( msg . sender ,
" Pour que l ' événement soit valide, ajouter %s à "
" l ' endroit où vous voulez que soit ajouté le "
" compte à rebours. " )
2012-04-09 02:19:39 +00:00
elif texts is not None and texts . group ( 2 ) is not None :
2012-06-20 14:24:19 +00:00
evt = ModuleState ( " event " )
2012-11-04 14:32:39 +00:00
evt [ " server " ] = msg . server
2012-06-20 14:24:19 +00:00
evt [ " channel " ] = msg . channel
2012-07-23 10:07:26 +00:00
evt [ " proprio " ] = msg . nick
2012-08-30 23:54:57 +00:00
evt [ " sender " ] = msg . sender
2012-06-20 14:24:19 +00:00
evt [ " name " ] = name . group ( 1 )
evt [ " msg_before " ] = texts . group ( 2 )
DATAS . addChild ( evt )
save ( )
2012-08-30 23:54:57 +00:00
return Response ( msg . sender , " Nouvelle commande ! %s ajoutée avec succès. " % name . group ( 1 ) )
2012-04-09 02:19:39 +00:00
else :
2012-08-30 23:54:57 +00:00
return Response ( msg . sender , " Veuillez indiquez les messages d ' attente et d ' après événement entre guillemets. " )
2012-04-09 02:19:39 +00:00
elif name is None :
2012-08-30 23:54:57 +00:00
return Response ( msg . sender , " Veuillez attribuer une commande à l ' événement. " )
2012-04-09 02:19:39 +00:00
else :
2012-08-30 23:54:57 +00:00
return Response ( msg . sender , " Un événement portant ce nom existe déjà. " )