]> gitweb.pimeys.fr Git - bots/themis.git/blobdiff - themis.py
C'est cool d'être daemonizable
[bots/themis.git] / themis.py
index 33b26972e6fa5a21289154389471799b0fb4d000..64212f7beeeaa6eaed05772dd9b0561b1d479aaa 100755 (executable)
--- a/themis.py
+++ b/themis.py
@@ -4,8 +4,6 @@
 
 # Un bot IRC pour kicker à tour de bras de #déprime
 
-import irclib
-import ircbot
 import threading
 import random
 import time
@@ -13,6 +11,13 @@ import socket, ssl, json
 import pickle
 import re
 import os
+import signal
+import sys
+
+# Oui, j'ai recodé ma version d'irclib pour pouvoir rattrapper les SIGHUP
+sys.path.insert(0, "/home/vincent/scripts/python-myirclib")
+import irclib
+import ircbot
 
 import sys
 config_debug_stdout=True
@@ -158,7 +163,7 @@ config_kick_answers=[u"Suis-je de trop ici ?",u"{}: je m'excuse pour ce bruit in
 config_kick_actions=[u"sera désormais exemplaire",u"prépare une lettre d'excuses à {}",u"essaiera de ne plus s'attirer les foudres de {}",u"croyait avoir tout bien fait… cruelle déception."]
 
 # config on m'a demandé de mourir/partir
-config_quit_messages=[u"Bye."]
+config_quit_messages=[u"J'ai enfin trouvé une corde et un tabouret"]
 config_leave_messages=config_quit_messages
 config_quit_fail_messages=[u"Tu rêves là."]
 config_leave_fail_messages=config_quit_fail_messages
@@ -166,7 +171,10 @@ config_leave_fail_messages=config_quit_fail_messages
 
 # config de kick
 config_kick_channels=config_chanlist
-config_smileys=[ur':(-|o)?\)', u'\^(_|\.)?\^', u':-?(p|P)', u'=(\)|D|p|P)', ur'\\o/', ur':-?D', ur'x(\)|D)', u'krkr', ur':-?(\]|>)', ur'(<|d|q|\(|\[)(:|=)']
+
+config_smileys = [ur':(-|o)?\)', u'\^(_|\.)?\^', u':-?(p|P)', u'=(\)|D|p|P)', ur'\\o/', ur':-?D', ur'x(\)|D)', u'krkr', ur':-?(\]|>)', ur'(<|d|q|\(|\[)(:|=)', u'mdr']
+config_anglicismes = [u"wtf", u"ftfy", u"it works?", u"fyi", u"kill[^ ]*", u"kick[^ ]*", u"chan(nel)?", u"join",
+u"btw", u"lmgtfy", u"rtfm", u"asap", u"afaik", u"shit", u"damn", u"fuck", u"bitch", u"updat(e|ed|ing)", u"lol", u"buffer[^ ]*", u"rofl"]
 
 def log(serveur,channel,auteur=None,message=None):
     f=open(get_config_logfile(serveur),"a")
@@ -180,11 +188,27 @@ def log(serveur,channel,auteur=None,message=None):
         print chain
     f.close()
 
-reg_is_smiley=re.compile(u".*("+u"|".join(config_smileys)+u")")
+reg_is_smiley = re.compile(u".*("+u"|".join(config_smileys)+u")")
 def is_smiley(chain):
     chain=unicode(chain,"utf8")
     o=re.match(reg_is_smiley,chain)
     return o
+
+reg_is_anglicisme = re.compile(u".*(?:^| )(" + u"|".join(config_anglicismes) + u")(?:$|\.| |,|;)")
+def is_anglicisme(chain):
+    chain = unicode(chain, "utf8").lower()
+    o = re.match(reg_is_anglicisme, chain)
+    return o
+
+# Cette liste contient la liste des raisons pour lesquelles on peut se faire kicker
+# chaque élément contient :
+#  - la fonction de détection du kick (qui matchera une regexp et renverra l'objet de match)
+#  - la raison donnée au moment du kick ({0} étant remplacé par ce qui a matché)
+config_kicking_list = [
+[is_smiley, u'"{0}" ? Ici on déprime.'],
+[is_anglicisme, u'"{0}" ? Get out, you and your fucking anglicism !']
+]
+
 def is_something(chain,matches,avant=u".*(?:^| )",apres=u"(?:$|\.| |,|;).*",case_sensitive=False,debug=False):
     if case_sensitive:
         chain=unicode(chain,"utf8")
@@ -508,18 +532,19 @@ class Themis(ircbot.SingleServerIRCBot):
                 serv.privmsg(canal, "%s: %s"%(auteur,config_utf8_fail))
             return
         pour_moi,message=self.pourmoi(serv,message)
-        smy=is_smiley(message)
-        if smy:
-            if canal in self.kick_channels:
-                serv.kick(canal,auteur,(u'"%s" ? Ici on déprime.'%(smy.groups()[0])).encode("utf8"))
-                return
+        for (detect, reason) in config_kicking_list:
+            matching = detect(message)
+            if matching:
+                if canal in self.kick_channels:
+                    serv.kick(canal,auteur,(reason.format(matching.groups()[0])).encode("utf8"))
+                    return
         if pour_moi and message.split()!=[]:
             cmd=message.split()[0].lower()
             try:
                 args=" ".join(message.split()[1:])
             except:
                 args=""
-            if cmd in ["meurs","die","crève"]:
+            if cmd in ["meurs","die","crève","pends-toi"]:
                 if auteur in self.overops:
                     log(self.serveur,canal,auteur,message+"[successful]")
                     self.mourir()
@@ -636,6 +661,12 @@ class Themis(ircbot.SingleServerIRCBot):
             log(self.serveur,"%s kické de %s par %s (raison : %s)" %(victime,channel,auteur,raison))
             time.sleep(2)
             serv.join(channel)
+            username = irclib.nm_to_u(ev.source()).lower()
+            print ev.source()
+            print channel, username
+            if channel == "#déprime" and "peb" in username or "becue" in username:
+                time.sleep(5)
+                serv.kick(auteur, "Va abuser de tes droits ailleurs !")
     
     def kicker(self, chan, pseudo, raison=None):
         if raison==None:
@@ -654,18 +685,48 @@ class Themis(ircbot.SingleServerIRCBot):
     def _getnick(self):
         return self.serv.get_nickname()
     nick=property(_getnick)
+    
+    def start_as_daemon(self, outfile):
+        sys.stderr = Logger(outfile)
+        self.start()
+
+
+class Logger(object):
+    """Pour écrire ailleurs que sur stdout"""
+    def __init__(self, filename="themis.full.log"):
+        self.filename = filename
+
+    def write(self, message):
+        f = open(self.filename, "a")
+        f.write(message)
+        f.close()
 
 
 if __name__=="__main__":
     import sys
     if len(sys.argv)==1:
-        print "Usage : themis.py <serveur> [--debug]"
+        print "Usage : themis.py <serveur> [--debug] [--no-output] [--daemon [--pidfile]] [--outfile]"
+        print "        --outfile sans --no-output ni --daemon n'a aucun effet"
         exit(1)
     serveur=sys.argv[1]
+    if "--daemon" in sys.argv:
+        thisfile = os.path.realpath(__file__)
+        thisdirectory = thisfile.rsplit("/", 1)[0]
+        os.chdir(thisdirectory)
+        daemon = True
+    else:
+        daemon = False
     if "debug" in sys.argv or "--debug" in sys.argv:
         debug=True
     else:
         debug=False
+    if "--no-output" in sys.argv or "--daemon" in sys.argv:
+        outfile = "/var/log/bots/themis.full.log"
+        for arg in sys.argv:
+            arg = arg.split("=")
+            if arg[0].strip('-') in ["out", "outfile", "logfile"]:
+                outfile = arg[1]
+        sys.stdout = Logger(outfile)
     serveurs={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
               "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
     try:
@@ -674,4 +735,21 @@ if __name__=="__main__":
         print "Server Unknown : %s"%(serveur)
         exit(404)
     themis=Themis(serveur,debug)
-    themis.start()
+    if daemon:
+        child_pid = os.fork()
+        if child_pid == 0:
+            os.setsid()
+            themis.start_as_daemon(outfile)
+        else:
+            # on enregistre le pid de themis
+            pidfile = "/var/run/bots/themis.pid"
+            for arg in sys.argv:
+                arg = arg.split("=")
+                if arg[0].strip('-') in ["pidfile"]:
+                    pidfile = arg[1]
+            f = open(pidfile, "w")
+            f.write("%s\n" % child_pid)
+            f.close()
+    else:
+        themis.start()
+