def init_jobs(): """attivita' da fare all'avvio di redcap""" M_RC.say("^2Starting RedCap...", 2) lista = M_RC.ini_clientlist() #recupero i client gia presenti sul server if lista: M_RC.ini_clientadd(lista) #li aggiungo M_RC.ini_recordlist() #recupero i record dal server M_RC.ini_spamlist() #carico la spamlist if M_CONF.Website_ON: #Se esiste un website di appoggio aggiorno la classifica, la trasferisco al server remoto e salvo il risultato dell'operazione nel log M_RC.say("^4Webrank updating...", 2) res = M_AUX.web_rank() if res == False: M_RC.scrivilog("WEBRANK TRANSFER FAILED", M_CONF.crashlog) M_RC.say("^4Q3ut4 parsing...", 2) q3ut4_parse() M_RC.say("^2Main routine started. Waiting for players identification...", 2) M_RC.ini_addcfg(M_CONF.SV_Basewar) #scrivo la basewar cfg in q3ut4 redcap_main() #LANCIO LA PROCEDURA PRINCIPALE
def redcap_main(): """Routine principale""" no_news = 0 #sensore di inattività serve while 1: M_RC.sleep(M_CONF.TempoCiclo) #wait for a cycletime no_news += M_CONF.TempoCiclo #nessuna news dal log if PARSER.novita(): #log check no_news = 0 #se ho parsato qualcosa azzero il sensore for frase in PARSER.outputs: #frase[0]=contenuto, frase[1]=tipo di frase (assigned from PARSER) if frase[1] == "InitGame": M_RC.initGame(frase[0]) #aggiorno le cvars del server CVARS = [matchmode, gametype,maxclients,mapname] continue elif frase[1].find("Client") != -1: #gestisco le frasi Client indirizzando alla funzione appropriata (i comandi li parso anche in fase di startup) exec("M_RC.%s(frase[0])"%frase[1].lower()) continue elif frase[1] == "Comandi": #COMANDI frase[0] (0,0=id, 0,1=comando) M_RC.comandi(frase[0]) #passo richiedente e parametri alla funzione comandi del modulo M_RC continue elif frase[1] == "InitRound": M_RC.initRound(frase[0]) continue if M_RC.GSRV.Server_mode > 2: #ALTRI EVENTI da processare solo a startup finito e non in war (0 = fase avvio 2 = warmode 3 = silentmode 5 = normale) if frase[1] == "Hits": M_RC.hits(frase[0]) #del tipo (['1', '0', '3', '5'], 'Hits') Vittima, Killer, Zona, Arma continue elif frase[1] == "Says": #SAY frase[0] (0,0=id, 0,1=testo) M_RC.says(frase[0]) continue elif frase[1] == "Radio": #SAY frase[0] (0,0=id, 0,1=msg del tipo "x - y") M_RC.radio(frase[0]) continue elif frase[1] == "Kills": #del tipo (['0', '0', '10'], 'Kills') M_RC.kills(frase[0]) continue elif frase[1] == "EndRound": M_RC.endRound(frase[0]) continue elif frase[1] == "EndMap": M_RC.endMap(frase[0]) continue if CRON1.is_time(): #ESEGUO OPERAZIONI A CRON1 if M_RC.GSRV.Server_mode > 2: #controlli fatti solo in modalita' normale o silent. M_RC.cr_tbkicked() #da fare sempre per primo M_RC.cr_floodcontrol() #controllo se qualcuno ha floodato M_RC.cr_nickrotation() #controllo se qualcuno fa nickrotation M_RC.cr_unvote() #controllo se c'e' un voto speciale attivo M_RC.cr_warning() #controllo se qualcuno ha troppi warning M_RC.cr_notorietycheck() #controllo notoriety bassa da fare per ultimo M_RC.cr_full() #controllo se il server e' pieno o vuoto (questo controllo va fatto sempre) if int(CRON1.ticks % (M_CONF.Spamtime // M_CONF.CRON1)) == 0: #divisione modulo per intervallo di spam M_RC.cr_spam() #spammo if CRON1.ticks == 240: #E' passata 1 ora circa q3ut4_parse() #aggiorno maplist e configs (non si sa mai...) CRON1.reset() if CRON2.is_time(): #ESEGUO OPERAZIONI A CRON2 if int(CRON2.ticks % ((M_CONF.w_webranktime*3600) // M_CONF.CRON2)) == 0: #divisione modulo per intervallo di aggiornamento classifica if M_CONF.Website_ON: #Se esiste un website di appoggio aggiorno la classifica, la trasferisco al server remoto e salvo il risultato dell'operazione nel log M_AUX.web_rank() M_AUX.web_FTPtransfer("HTML" + "/" + M_CONF.w_tabella, M_CONF.w_tabella) if CRON2.get_time("Ora") == M_CONF.Control_Daily: #all'ora prefissata eseguo operazioni giornaliere (pulizia DB, riavvio server, etc) M_RC.cr_recordErase() #Pulisco i record se del giorno (settimana, mese) prima. M_AUX.automaintenance() #automanutenzione e riavvio # -= Non puo' leggere istruzioni oltre qui (riavvio server e redcap!) =- if no_news > M_CONF.GameServerDown: #il gameserver non da notizie da circa 60 sec M_AUX.check_gameserver() #il log è fermo. controllo se il gameserver è up. no_news = 0
def redcap_main(): """Routine principale""" no_news = 0 #sensore di inattività serve while 1: M_RC.sleep(M_CONF.TempoCiclo) #wait for a cycletime no_news += M_CONF.TempoCiclo #nessuna news dal log if PARSER.novita(): #log check no_news = 0 #se ho parsato qualcosa azzero il sensore for frase in PARSER.outputs: #frase[0]=contenuto, frase[1]=tipo di frase (assigned from PARSER) if frase[1] == "InitGame": M_RC.initGame( frase[0] ) #aggiorno le cvars del server CVARS = [matchmode, gametype,maxclients,mapname] continue elif frase[1].find( "Client" ) != -1: #gestisco le frasi Client indirizzando alla funzione appropriata (i comandi li parso anche in fase di startup) exec("M_RC.%s(frase[0])" % frase[1].lower()) continue elif frase[ 1] == "Comandi": #COMANDI frase[0] (0,0=id, 0,1=comando) M_RC.comandi( frase[0] ) #passo richiedente e parametri alla funzione comandi del modulo M_RC continue elif frase[1] == "InitRound": M_RC.initRound(frase[0]) continue if M_RC.GSRV.Server_mode > 2: #ALTRI EVENTI da processare solo a startup finito e non in war (0 = fase avvio 2 = warmode 3 = silentmode 5 = normale) if frase[1] == "Hits": M_RC.hits( frase[0] ) #del tipo (['1', '0', '3', '5'], 'Hits') Vittima, Killer, Zona, Arma continue elif frase[1] == "Says": #SAY frase[0] (0,0=id, 0,1=testo) M_RC.says(frase[0]) continue elif frase[ 1] == "Radio": #SAY frase[0] (0,0=id, 0,1=msg del tipo "x - y") M_RC.radio(frase[0]) continue elif frase[ 1] == "Kills": #del tipo (['0', '0', '10'], 'Kills') M_RC.kills(frase[0]) continue elif frase[1] == "EndRound": M_RC.endRound(frase[0]) continue elif frase[1] == "EndMap": M_RC.endMap(frase[0]) continue if CRON1.is_time(): #ESEGUO OPERAZIONI A CRON1 if M_RC.GSRV.Server_mode > 2: #controlli fatti solo in modalita' normale o silent. M_RC.cr_tbkicked() #da fare sempre per primo M_RC.cr_floodcontrol() #controllo se qualcuno ha floodato M_RC.cr_nickrotation() #controllo se qualcuno fa nickrotation M_RC.cr_unvote() #controllo se c'e' un voto speciale attivo M_RC.cr_warning() #controllo se qualcuno ha troppi warning M_RC.cr_notorietycheck( ) #controllo notoriety bassa da fare per ultimo M_RC.cr_full( ) #controllo se il server e' pieno o vuoto (questo controllo va fatto sempre) if int( CRON1.ticks % (M_CONF.Spamtime // M_CONF.CRON1)) == 0: #divisione modulo per intervallo di spam M_RC.cr_spam() #spammo if CRON1.ticks == 240: #E' passata 1 ora circa q3ut4_parse() #aggiorno maplist e configs (non si sa mai...) CRON1.reset() if CRON2.is_time(): #ESEGUO OPERAZIONI A CRON2 if int( CRON2.ticks % ((M_CONF.w_webranktime * 3600) // M_CONF.CRON2) ) == 0: #divisione modulo per intervallo di aggiornamento classifica if M_CONF.Website_ON: #Se esiste un website di appoggio aggiorno la classifica, la trasferisco al server remoto e salvo il risultato dell'operazione nel log M_AUX.web_rank() M_AUX.web_FTPtransfer("HTML" + "/" + M_CONF.w_tabella, M_CONF.w_tabella) if CRON2.get_time( "Ora" ) == M_CONF.Control_Daily: #all'ora prefissata eseguo operazioni giornaliere (pulizia DB, riavvio server, etc) M_RC.cr_recordErase( ) #Pulisco i record se del giorno (settimana, mese) prima. M_AUX.automaintenance() #automanutenzione e riavvio # -= Non puo' leggere istruzioni oltre qui (riavvio server e redcap!) =- if no_news > M_CONF.GameServerDown: #il gameserver non da notizie da circa 60 sec M_AUX.check_gameserver( ) #il log è fermo. controllo se il gameserver è up. no_news = 0
"""gestisce i crash del programma, scrivendo l'errore nel file di log""" import traceback evento = "\r\n REDCAP CRASH:: " for stringa in traceback.format_tb(tra): evento += str(stringa) for stringa in traceback.format_exception_only(sys.last_type, sys.last_value): evento += str(stringa) M_RC.scrivilog(evento, M_CONF.crashlog) sys.exit() sys.excepthook = crashlog #Abilito il log dei crash PARSER = C_PARSER.Parser(M_CONF.NomeFileLog) #Istanzio il Parser CRON1 = M_AUX.Cronometro(M_CONF.CRON1) #Istanzio il cron1 CRON2 = M_AUX.Cronometro(M_CONF.CRON2) #Istanzio il cron2 def init_jobs(): """attivita' da fare all'avvio di redcap""" M_RC.say("^2Starting RedCap...", 2) lista = M_RC.ini_clientlist() #recupero i client gia presenti sul server if lista: M_RC.ini_clientadd(lista) #li aggiungo M_RC.ini_recordlist() #recupero i record dal server M_RC.ini_spamlist() #carico la spamlist if M_CONF.Website_ON: #Se esiste un website di appoggio aggiorno la classifica, la trasferisco al server remoto e salvo il risultato dell'operazione nel log M_RC.say("^4Webrank updating...", 2) res = M_AUX.web_rank() if res == False: