Compare commits
No commits in common. "master" and "timer" have entirely different histories.
8 changed files with 64 additions and 234 deletions
173
bots.yaml
173
bots.yaml
|
@ -11,7 +11,6 @@ bots:
|
||||||
- "<David_5-1> bon, babel avec un pare-feu nftables, vous avez prévu d'y réfléchir pour 2042 ou ça a des chances d'arriver sous peu ?"
|
- "<David_5-1> bon, babel avec un pare-feu nftables, vous avez prévu d'y réfléchir pour 2042 ou ça a des chances d'arriver sous peu ?"
|
||||||
- "<Chibrac> je glande presque autant qu'un pelec"
|
- "<Chibrac> je glande presque autant qu'un pelec"
|
||||||
- "<Chibrac> choisi l'excuse du moment chez ton supelec : l'inté, la campagne, les partiels, les vacances"
|
- "<Chibrac> choisi l'excuse du moment chez ton supelec : l'inté, la campagne, les partiels, les vacances"
|
||||||
- "<Chibrac> ouais mais j'ai jamais vu de gens aussi efficaces que les pelec pour justifier pq ils peuvent pas faire un truc"
|
|
||||||
- "<Grubigrub> Chirac on connaît tous tes performances scolaires t'inquiète pas"
|
- "<Grubigrub> Chirac on connaît tous tes performances scolaires t'inquiète pas"
|
||||||
- "Un jour j'irais me frotter à #federez, pour voir du gros sel."
|
- "Un jour j'irais me frotter à #federez, pour voir du gros sel."
|
||||||
- "<S&M> un prof de maths est généralement compétent en maths, alors que j’attends toujours de rencontrer un prof d’info qui est capable de mettre quelque chose en prod"
|
- "<S&M> un prof de maths est généralement compétent en maths, alors que j’attends toujours de rencontrer un prof d’info qui est capable de mettre quelque chose en prod"
|
||||||
|
@ -23,12 +22,6 @@ bots:
|
||||||
- "<Klafyvel> Je préfère parler de limitation de débit afin de prioriser les services critiques."
|
- "<Klafyvel> Je préfère parler de limitation de débit afin de prioriser les services critiques."
|
||||||
- "<Grubigrub> Le jour où @lebanni est engagé dans une entreprise,j'y enlève toutes mes actions."
|
- "<Grubigrub> Le jour où @lebanni est engagé dans une entreprise,j'y enlève toutes mes actions."
|
||||||
- "<Nanoy> Toute façon, les prezs rezo c'est souvent des pots de fleurs avec une clé root."
|
- "<Nanoy> Toute façon, les prezs rezo c'est souvent des pots de fleurs avec une clé root."
|
||||||
- "<@lebanni> Je suis un gros quetard"
|
|
||||||
- "La soeur du banni : Matthieu, tu peux m'aider sur mon exo de maths ? @lebanni : Flemme, mon temps vaut de l'argent"
|
|
||||||
- "<Nanoy> Un JT c'est pas comme des nocturnes FedeRez, ça s'organise pas tout seul."
|
|
||||||
- "<Curlyboi> VR est une grosse asso \"comme les autres\" à Gif, c'est pas gagné quand t'es composé de weeb pédophiles, de fachos autoritaires ou de gros geek de jdr"
|
|
||||||
- "<Chibrac> Apres un tas de fumier reste un tas de fumier"
|
|
||||||
- "<Benjamin> Ahahahaha, je préfère la religion au javascript. Mais le JS est devenu une religion, ALORS ALLEZ TOUS VOUS FAIRE FOUTRE."
|
|
||||||
on_match:
|
on_match:
|
||||||
'détruire le monde' : "Manu on fait des collages ?"
|
'détruire le monde' : "Manu on fait des collages ?"
|
||||||
'imprimante' : "Je pense qu'on devrait reprendre la même imprimante Brother."
|
'imprimante' : "Je pense qu'on devrait reprendre la même imprimante Brother."
|
||||||
|
@ -37,7 +30,7 @@ bots:
|
||||||
'telegram' : "{user} : tu devrais passer à irc."
|
'telegram' : "{user} : tu devrais passer à irc."
|
||||||
'irc.*matrix' : "{user} : tu devrais passer à matrix."
|
'irc.*matrix' : "{user} : tu devrais passer à matrix."
|
||||||
'matrix.*irc' : "> {message}\nLes vrais font tourner matrix dans un tmux."
|
'matrix.*irc' : "> {message}\nLes vrais font tourner matrix dans un tmux."
|
||||||
'proxmox' : "proxmox c'est surfait, faut l'autoremove"
|
'proxmox' : "promox c'est surfait, faut l'autoremove"
|
||||||
on_join: 'Unleash the salt'
|
on_join: 'Unleash the salt'
|
||||||
Macron:
|
Macron:
|
||||||
on_ping:
|
on_ping:
|
||||||
|
@ -64,185 +57,27 @@ bots:
|
||||||
- "Faites du vpn sur l'ecole ou sur la rez depuis l'exterieur"
|
- "Faites du vpn sur l'ecole ou sur la rez depuis l'exterieur"
|
||||||
- "Je viens donc de supprimer les comptes et de détruire les boites mail"
|
- "Je viens donc de supprimer les comptes et de détruire les boites mail"
|
||||||
- "Au fait, j'ai l'impression que vous avez limité ma vitesse de téléchargement, c'est un peu lent je trouve ... évitez de brider ma machine svp"
|
- "Au fait, j'ai l'impression que vous avez limité ma vitesse de téléchargement, c'est un peu lent je trouve ... évitez de brider ma machine svp"
|
||||||
- "Renaud c'est un visionnaire, mais un visionnaire aveugle"
|
|
||||||
- "J'ai pas besoin de cirer des pompes ou sucer des bites. Ah je suis avec des élèves je te laisse"
|
|
||||||
- "Annie elle aurait bien aimé être à fond DANS John Cagnol"
|
|
||||||
- "Quand tu veux rouler vite et efficace, allongé c'est confortable"
|
|
||||||
- "J'aime bien Sexion d'assaut"
|
|
||||||
- "Si vous voulez pisser depuis le toit attendez que le directeur passe en-dessous"
|
|
||||||
- "Pour être handicapé mental, faut déjà avoir un cerveau"
|
|
||||||
- "Le prêtre a dit qu'il ne pouvait décemment pas prendre Gutzwiller : il est trop près de son Macintosh"
|
|
||||||
- "Il est très bon, mais il est très con"
|
|
||||||
- "On bute tout le monde et on recommence"
|
|
||||||
- "Je suis toujours un peu en avance de phase"
|
|
||||||
- "Stop. Tue toi."
|
|
||||||
- "La mort par convention mutuelle si je puis dire"
|
|
||||||
- "Lâche moi la souris"
|
|
||||||
- "On a une commande qui est 'casse-toi tu pue' et un autre qui dit 'casse-toi tu pompes les ressources'"
|
|
||||||
on_match:
|
on_match:
|
||||||
"password" : "Ah facile pour avoir accès aux switches, id: root, mdp: switch"
|
"password" : "Ah facile pour avoir accès aux switches, id: root, mdp: switch"
|
||||||
"nvidia" : "Les cartes nvidia c'est de la merde"
|
|
||||||
Claudy:
|
Claudy:
|
||||||
on_ping:
|
on_ping:
|
||||||
- "Ou tu sors, ou j'te sors, hein, mais faudra prendre une décision."
|
|
||||||
- "Tu sais {user}, si j'suis toujours si bien accompagné, c'est pour mon argent hein, c'est pas pour mon odeur... Et ça ça fait mal"
|
- "Tu sais {user}, si j'suis toujours si bien accompagné, c'est pour mon argent hein, c'est pas pour mon odeur... Et ça ça fait mal"
|
||||||
- "Ou tu sors, ou j'te sors, hein, mais faudra prendre une décision."
|
- "Ou tu sors, ou j'te sors, hein, mais faudra prendre une décision."
|
||||||
- "Et à propos de vieille truie toi comment ça va ?"
|
- "Et à propos de vieille truie toi comment ça va ?"
|
||||||
- "Dis, on t'a jamais appris à manger la bouche fermée toi ? J'ai l'impression d'être à côté d'un camion poubelle qui travaille moi ici !"
|
- "Dis, on t'a jamais appris à manger la bouche fermée toi ? J'ai l'impression d'être à côté d'un camion poubelle qui travaille moi"
|
||||||
- "Faut pas commencer à jouer avec mes couilles"
|
- "Faut pas commencer à jouer avec mes couilles"
|
||||||
- "Minutes papillon, je termine"
|
- "Minutes papillon, je termine"
|
||||||
- "Bouge pas, j'vais aller chercher l'poney."
|
|
||||||
- "C'est toi qui va décharger l'cochon ? T'es épais comme un câble de frein à main"
|
- "C'est toi qui va décharger l'cochon ? T'es épais comme un câble de frein à main"
|
||||||
- "Je n'en peux plus, je suis au bout du rouleau. J'ai envie de rentrer, me foutre dans mes savates et terminé bonsoir"
|
- "Je n'en peux plus, je suis au bout du rouleau. J'ai envie de rentrer, me foutre dans mes savates et terminé bonsoir"
|
||||||
- "Voilà ben j'me présente en deux mots. Je suis Claudy Focan, Monsieur Focan plus exactement, je suis directeur NCS Marketing Manager des abattoirs d'Anderlecht."
|
- "Voilà ben j'me présente en deux mots. Je suis Claudy Focan, Monsieur Focan plus exactement, je suis directeur NCS Marketing Manager des abattoirs d'Anderlecht."
|
||||||
- "Ah, maman ? Claudy à l'appareil dis, je viens de m'faire carjacker ! Je dis, je viens de me faire carjacker ! On a volé l'auto ! Non j'ai rien su faire ! J'ai taché de courir derrière qu'est-ce que tu veux faire ?"
|
|
||||||
- "Écoute ma fille, si ça t’intéresse, t’as mon numéro qu’est là, si ça t’intéresse pas au revoir Monsieur bon weekend... qu’est ce que tu veux que j‘te dise moi ?"
|
|
||||||
- "En tout cas y t’ont pas loupée, j’sais pas si c’est un ch’val ou une truie là, t’as vu ta tronche ou quoi ? Peut aussi faire un bouquin sur Halloween s’tu veux hein !"
|
|
||||||
Chuck:
|
Chuck:
|
||||||
on_ping:
|
on_ping:
|
||||||
- "No, thanks."
|
- "No, thanks."
|
||||||
on_ping_python:
|
on_ping_python:
|
||||||
- 'klafirc.bots.chuck_norris.on_ping'
|
- 'klafirc.bots.chuck_norris.on_ping'
|
||||||
Laouen:
|
|
||||||
on_match:
|
|
||||||
'[Cc]oop[eé]\s(?!(TM))' : 'On dit CoopéTM !'
|
|
||||||
on_join: 'La CoopéTM est ouverte'
|
|
||||||
min_time: 3 # in seconds
|
|
||||||
Grubigrub:
|
|
||||||
on_match:
|
|
||||||
'[Mm]icrosoft' : 'Corruption institutionnalisée !'
|
|
||||||
min_time: 3 # in seconds
|
|
||||||
Karadoc:
|
|
||||||
on_ping:
|
|
||||||
- "Le gras, c'est la vie"
|
|
||||||
- "Bien manger c'est important !"
|
|
||||||
- "L'agneau était daubé du cul !"
|
|
||||||
- "Eh oui mémé, t'es bien mouchée !"
|
|
||||||
- "Sans blague, y'a pas de la gourdasse ?"
|
|
||||||
- "Par exemple, vous prenez aujourd’hui. Vous comptez sept jours. Ça vous emmène dans une semaine. Et bien on sera exactement le même jour qu’aujourd’hui… À une vache près, hein… C’est pas une science exacte."
|
|
||||||
- "Les chicots, c'est sacré ! Parce que si j'les lave pas maintenant, dans dix ans, c'est tout à la soupe. Et l'mec qui me fera manger de la soupe il est pas né !"
|
|
||||||
- "Si ça peut m'éviter de chlinguer du cul, je peux bien me tremper une ou deux fois par an."
|
|
||||||
- "Ça y est… je vois trouble. C’est le manque de gras, je me dessèche."
|
|
||||||
- "On la politique de l'autruche, avant je comprenais pas. Mais maintenant que j'en ai vu une d'autruche, c'est bon ! Une politique qui court vite ! Une politique qui fait des gros oeufs, c'est tout !"
|
|
||||||
on_match:
|
|
||||||
'[Jj]uniper' : "C'est d'la merde"
|
|
||||||
'[Cc]routons?' : "Des p'tits croutons tout vieux genre pour les lapins ? Ouais j'savais pas c'que c'était, dans le doute j'les ai bouffés."
|
|
||||||
'[Ss]i[èe]ge' : "MAIS Y'EN A PAS DE SIÈGE PAUVRE CONNE !"
|
|
||||||
'[Ff]romages?' : "Oh le con ! Mais il est pas fini d'affiner !"
|
|
||||||
min_time: 3 # in seconds
|
|
||||||
Perceval:
|
|
||||||
on_ping:
|
|
||||||
- "C'est pas faux"
|
|
||||||
on_match:
|
|
||||||
"Le gras, c'est la vie" : "C'est pas faux"
|
|
||||||
"PROJEEEET" : "Toi, un jour, je te crâme ta famille, toi."
|
|
||||||
min_time: 3 # in seconds
|
|
||||||
OpenSuze:
|
|
||||||
on_ping:
|
|
||||||
- "Tu reprends de la soupe ?"
|
|
||||||
on_join: 'Bonjour les enfants !'
|
|
||||||
on_match:
|
|
||||||
"(Y|y|([Ii]l (n')?y)) en a plus" : "Y en a plus ? J'ai tout bu ?"
|
|
||||||
"[Ss]oupe" : "J'ai préparé une soupe avec une petite courge de 5kg."
|
|
||||||
min_time: 3 # in seconds
|
|
||||||
Souby:
|
|
||||||
on_match:
|
|
||||||
"[Cc]oop[eé]" : "{user} : mot interdit sur notre campus sans alcool !"
|
|
||||||
min_time: 3 # in seconds
|
|
||||||
Gutzwiller:
|
|
||||||
on_ping:
|
|
||||||
- "Les ordinateurs, c'est comme les galères romaines : moins il y a de RAM, et plus ça rame !"
|
|
||||||
- "Il pédale dans la choucroute !"
|
|
||||||
- "On a quand même de la chance, on vit beaucoup plus longtemps que nos ordinateurs."
|
|
||||||
- "Intel c’est pas le contraire de \"tel autre\" hein, c’est la marque."
|
|
||||||
- "Et depuis, je n'ai plus jamais utilisé de Macs."
|
|
||||||
- "\"Plug and Play\" pour moi c’est plutôt \"je plug et j’me plains.\""
|
|
||||||
- "Soit ils on changé la route, soit il y a un bogue."
|
|
||||||
- "Vous avez besoin de ce cours… \"ce cours\" en en deux mots hein ! Pas \"secours\"!"
|
|
||||||
- "Machine de Mealy. [Prononcé \"Machine de Millet.\"]"
|
|
||||||
- "La myopie forte."
|
|
||||||
- "Au bout de trois vies, c’est *Game Over* ! [L’examen, le rattrapage et la commission.]"
|
|
||||||
- "J’ai tout validé à 18. Sauf l’électromagnétisme, j’ai validé à 4."
|
|
||||||
- "C’est parce que moi je vois les champs magnétiques, mais du coup je ne savais pas faire les démonstrations."
|
|
||||||
- "Je me suis pointé en retard parce que je réveillais mon copiaule."
|
|
||||||
- "Il y a plein de *Klein* autour de chez mes parents."
|
|
||||||
- "Ils sont sérieux les Alsaciens !"
|
|
||||||
- "C’est un bon conducteur, mais il consomme plus que son véhicule."
|
|
||||||
- "Et si jamais on pouvait mettre autre chose que des roues ?"
|
|
||||||
- "C’était une flaque de flotte, la Suisse : aquaplaning sur 300 bornes !"
|
|
||||||
- "Aujourd’hui, on fera des crêpes !"
|
|
||||||
- "Tiens, ça pourrait être mon repas de midi ça !"
|
|
||||||
- "Je mets de la farine, du lait puis des œufs… Ben je prépare des crêpes !"
|
|
||||||
- "On souhaite fabriquer un modem… pas le parti politique, hein !"
|
|
||||||
- "Schlumberger, ils font de la discrimination à l’envers : ils aiment beaucoup les étrangers et les femmes."
|
|
||||||
- "Pensez autrement."
|
|
||||||
- "Mon accent anglais, c’est comme le français, c’est approximatif."
|
|
||||||
- "Comme le disait un de mes profs : \"Et surtout… Essayez de me suivre !\""
|
|
||||||
- "Des fois… c’est dur la vie d’artiste."
|
|
||||||
- "J’aime pas les pommes, je préfère les poires."
|
|
||||||
- "Ce jour-là, j’étais en pétard. Contre le foot. [Enterrement pendant la victoire de la France à la coupe du monde de 1998.]"
|
|
||||||
- "Et donc, j’ai toujours un stylo sur moi."
|
|
||||||
- "Vous connaissez la règle des trois \"pourquoi\" ? Pour avoir la vérité sur quelque chose, on pose la question, puis on demande trois fois \"pourquoi ?\""
|
|
||||||
- "Vous risquez le décollement de la rétine."
|
|
||||||
- "N’essayez pas de faire voir la télé couleur à une vache !"
|
|
||||||
- "Les bras m’en tombent."
|
|
||||||
- "Vous savez comment on dit \"Il fait froid\" en japonais ? SAKAI !"
|
|
||||||
- "L’opérateur rouge c’est celui qui sait faire [SFR]. Mais aujourd’hui, il sait pas faire."
|
|
||||||
- "Les appareils photos numériques changent beaucoup plus vite que les humains. La preuve, j'suis là mon premier appareil photo numérique il est plus là."
|
|
||||||
- "Moi je suis vraiment sans mémoire."
|
|
||||||
- "Les vendeurs d'oscillos ont peur de moi."
|
|
||||||
- "Un filtre de Jean-Louis Gutzwiller, histoire de laisser mon nom à la postérité."
|
|
||||||
- "Ma maman, elle n'est pas de ce monde-là."
|
|
||||||
- "Et paf ! 3dB dans les dents !"
|
|
||||||
min_time: 3 # in seconds
|
|
||||||
Sciamanna:
|
|
||||||
on_ping:
|
|
||||||
- "Ça me désole quand munme."
|
|
||||||
- "Le monde va mal, vous savez. Faites HEC."
|
|
||||||
- "C'est pipoland m'voyez."
|
|
||||||
- "À Supélec, je ne sais pas comment ils fonctionnent."
|
|
||||||
- "C'est pas un Belge qui va révolutionner les grandes écoles, chacun sa merde."
|
|
||||||
- "Eh je suis pas un tueur. Enfin dans la vraie vie, si. D'ailleurs il y a eu un meurtre non élucidé près de chez moi, mais c'est pas moi."
|
|
||||||
- "C'est comme votre latence matinale, moi j'arrive avec mon sin(t) et je vous secoue harmoniquement."
|
|
||||||
- "Je vais essayer de vous aider, il va y avoir une sélection naturelle."
|
|
||||||
- "Si quelqu'un fait une thèse, il a 3 points de plus à l'exam'."
|
|
||||||
- "Si on me demande plus que le passé, je dis que le passé du passé c'est le passé."
|
|
||||||
- "C'est mal foutu parce que ce n'est pas moi qui l'ai fait mais des gens de Paris."
|
|
||||||
- "Marcher c'est compliqué."
|
|
||||||
- "Vous savez, j'ai mis un temps fou à comprendre qu'on avait cours ici."
|
|
||||||
on_match:
|
|
||||||
"[Pp]hotonique" : "C'est la science du XXIIe siècle."
|
|
||||||
min_time: 3 # in seconds
|
|
||||||
Houzelle:
|
|
||||||
on_ping:
|
|
||||||
- "C'est très simple."
|
|
||||||
- "C'est facile."
|
|
||||||
- "Effectivement."
|
|
||||||
- "Alors."
|
|
||||||
- "Donc."
|
|
||||||
- "Voilà."
|
|
||||||
- "Ok ?"
|
|
||||||
- "Hein."
|
|
||||||
- "D'accord ?"
|
|
||||||
- "Euh..."
|
|
||||||
- "Bon."
|
|
||||||
- "Bref."
|
|
||||||
- "D'accord ? Ok ? Voilà. Alors..."
|
|
||||||
min_time: 1 # in seconds
|
|
||||||
|
|
||||||
rip_lorrabelle:
|
|
||||||
on_ping:
|
|
||||||
- "Not under my watch."
|
|
||||||
on_match:
|
|
||||||
"[Ll]orrabelle" : "@klafyvel: tocard"
|
|
||||||
|
|
||||||
channels:
|
channels:
|
||||||
- server: irc.rezometz.org
|
- server: irc.rezometz.org
|
||||||
port: 6667
|
port: 6667
|
||||||
channel: #campus"
|
channel: "#test"
|
||||||
bots: [sel, Macron, Patou, Claudy, Chuck, Laouen, Grubigrub, Perceval, OpenSuze, Gutzwiller, Sciamanna, Houzelle]
|
bots: [sel, Macron, Patou, Claudy, Chuck]
|
||||||
- server: irc.rezosup.org
|
|
||||||
port: 6667
|
|
||||||
channel: "#centrale-supelec"
|
|
||||||
bots: [Souby, Chuck]
|
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@ import random
|
||||||
import importlib
|
import importlib
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
class Bot:
|
class Bot:
|
||||||
def __init__(self, nickname):
|
def __init__(self, nickname):
|
||||||
"""Initialize a bot object
|
"""Initialize a bot object
|
||||||
|
@ -18,8 +17,8 @@ class Bot:
|
||||||
self.reactions = {}
|
self.reactions = {}
|
||||||
self.pings = []
|
self.pings = []
|
||||||
self.on_join = None
|
self.on_join = None
|
||||||
self.tg_user_match = re.compile("^<\x03..\x02\x02(?P<username>.+)\x03>")
|
self.tg_user_match = re.compile('^<\x03..\x02\x02(?P<username>.+)\x03>')
|
||||||
self.ping_match = re.compile("(<.+> )?\@?{name}".format(name=nickname))
|
self.ping_match = re.compile('^(<.+> )?\@?{name}'.format(name=nickname))
|
||||||
self.min_time = 0
|
self.min_time = 0
|
||||||
self.last_time = datetime.datetime(1,1,1)
|
self.last_time = datetime.datetime(1,1,1)
|
||||||
|
|
||||||
|
@ -31,9 +30,9 @@ class Bot:
|
||||||
reaction: The string which will be sent.
|
reaction: The string which will be sent.
|
||||||
"""
|
"""
|
||||||
context = {
|
context = {
|
||||||
"server": self.server,
|
'server': self.server,
|
||||||
"channel": self.channel,
|
'channel': self.channel,
|
||||||
"name": self.nickname,
|
'name': self.nickname,
|
||||||
}
|
}
|
||||||
self.reactions[re.compile(match.format(**context))] = reaction
|
self.reactions[re.compile(match.format(**context))] = reaction
|
||||||
|
|
||||||
|
@ -56,8 +55,8 @@ class Bot:
|
||||||
|
|
||||||
def fetch_callback(self, path):
|
def fetch_callback(self, path):
|
||||||
"""Fetch a Python callable"""
|
"""Fetch a Python callable"""
|
||||||
s = path.split(".")
|
s = path.split('.')
|
||||||
module, callback = ".".join(s[:-1]), s[-1]
|
module, callback = '.'.join(s[:-1]), s[-1]
|
||||||
module = importlib.import_module(module)
|
module = importlib.import_module(module)
|
||||||
return getattr(module, callback)
|
return getattr(module, callback)
|
||||||
|
|
||||||
|
@ -74,22 +73,21 @@ class Bot:
|
||||||
"""
|
"""
|
||||||
if (datetime.datetime.now() - self.last_time).total_seconds() < self.min_time:
|
if (datetime.datetime.now() - self.last_time).total_seconds() < self.min_time:
|
||||||
return []
|
return []
|
||||||
username = user.split("!")[0]
|
username = user.split('!')[0]
|
||||||
tg_user_match = self.tg_user_match.match(message)
|
tg_user_match = self.tg_user_match.match(message)
|
||||||
if "bot" in username.lower() and tg_user_match:
|
if 'bot' in username.lower() and tg_user_match:
|
||||||
username = "@" + tg_user_match.groupdict()["username"]
|
username = '@' + tg_user_match.groupdict()['username']
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
"server": self.server,
|
'server': self.server,
|
||||||
"channel": channel,
|
'channel': channel,
|
||||||
"name": self.nickname,
|
'name': self.nickname,
|
||||||
"user": username,
|
'user': username,
|
||||||
"message": message,
|
'message': message
|
||||||
}
|
}
|
||||||
result = []
|
result = []
|
||||||
for m in self.reactions.keys():
|
for m in self.reactions.keys():
|
||||||
search = m.search(message)
|
if m.search(message):
|
||||||
if search:
|
|
||||||
r = self.reactions[m]
|
r = self.reactions[m]
|
||||||
if callable(r):
|
if callable(r):
|
||||||
r = r(self, username, channel, message)
|
r = r(self, username, channel, message)
|
||||||
|
@ -103,9 +101,10 @@ class Bot:
|
||||||
r = r(self, username, channel, message)
|
r = r(self, username, channel, message)
|
||||||
else:
|
else:
|
||||||
r = r.format(**context)
|
r = r.format(**context)
|
||||||
result.append(" : ".join([username, r]))
|
result.append(' : '.join([username, r]))
|
||||||
|
|
||||||
if len(result) > 0:
|
if len(result) > 0:
|
||||||
self.last_time = datetime.datetime.now()
|
self.last_time = datetime.datetime.now()
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
|
@ -6,9 +6,8 @@ import json
|
||||||
|
|
||||||
|
|
||||||
def get_content():
|
def get_content():
|
||||||
r = requests.get("https://api.chucknorris.io/jokes/random")
|
r = requests.get('https://api.chucknorris.io/jokes/random')
|
||||||
return json.loads(r.content)["value"]
|
return json.loads(r.content)['value']
|
||||||
|
|
||||||
|
|
||||||
def on_ping(bot, user, channel, message):
|
def on_ping(bot, user, channel, message):
|
||||||
return get_content()
|
return get_content()
|
||||||
|
|
|
@ -6,36 +6,34 @@ from twisted.internet import reactor, protocol
|
||||||
from .bot import Bot
|
from .bot import Bot
|
||||||
from .settings import logger
|
from .settings import logger
|
||||||
|
|
||||||
|
|
||||||
class IRCBot(irc.IRCClient):
|
class IRCBot(irc.IRCClient):
|
||||||
"""An IRC bot"""
|
"""An IRC bot"""
|
||||||
|
|
||||||
def connectionMade(self):
|
def connectionMade(self):
|
||||||
super(IRCBot, self).connectionMade()
|
super(IRCBot, self).connectionMade()
|
||||||
logger.info("{name} is connected".format(name=self.nickname))
|
logger.info('{name} is connected'.format(name=self.nickname))
|
||||||
self.join(self.factory.channel)
|
self.join(self.factory.channel)
|
||||||
|
|
||||||
def connectionLost(self, reason):
|
def connectionLost(self, reason):
|
||||||
super(IRCBot, self).connectionLost(reason)
|
super(IRCBot, self).connectionLost(reason)
|
||||||
logger.info(
|
logger.info('{name} is disconnected : {reason}'.format(
|
||||||
"{name} is disconnected : {reason}".format(
|
name=self.nickname,
|
||||||
name=self.nickname, reason=reason
|
reason = reason
|
||||||
)
|
))
|
||||||
)
|
|
||||||
|
|
||||||
def signedOn(self):
|
def signedOn(self):
|
||||||
self.join(self.factory.channel)
|
self.join(self.factory.channel)
|
||||||
|
|
||||||
def joined(self, channel):
|
def joined(self, channel):
|
||||||
logger.info(self.nickname + " joined " + self.factory.channel)
|
logger.info(self.nickname + ' joined ' + self.factory.channel)
|
||||||
if self.factory.bot.on_join is not None:
|
if self.factory.bot.on_join is not None:
|
||||||
self.say(self.factory.channel, self.factory.bot.on_join)
|
self.say(self.factory.channel, self.factory.bot.on_join)
|
||||||
|
|
||||||
def privmsg(self, user, channel, msg):
|
def privmsg(self, user, channel, msg):
|
||||||
results = self.factory.bot.get_reaction(user, channel, msg)
|
results = self.factory.bot.get_reaction(user, channel, msg)
|
||||||
logger.debug(self.nickname + " heard " + msg)
|
logger.debug(self.nickname + ' heard ' + msg)
|
||||||
if results:
|
if results:
|
||||||
logger.info(self.nickname + " reacting to " + msg)
|
logger.info(self.nickname + ' reacting to ' + msg)
|
||||||
for r in results:
|
for r in results:
|
||||||
self.say(self.factory.channel, r)
|
self.say(self.factory.channel, r)
|
||||||
|
|
||||||
|
@ -51,7 +49,7 @@ class IRCBotFactory(protocol.ClientFactory):
|
||||||
connector.connect()
|
connector.connect()
|
||||||
|
|
||||||
def clientConnectionFailed(self, connector, reason):
|
def clientConnectionFailed(self, connector, reason):
|
||||||
logger.info("Connection failed : " + str(reason))
|
logger.info("Connection failed : " + reason)
|
||||||
reactor.stop()
|
reactor.stop()
|
||||||
|
|
||||||
def buildProtocol(self, addr):
|
def buildProtocol(self, addr):
|
||||||
|
@ -59,3 +57,4 @@ class IRCBotFactory(protocol.ClientFactory):
|
||||||
p.factory = self
|
p.factory = self
|
||||||
p.nickname = self.bot.nickname
|
p.nickname = self.bot.nickname
|
||||||
return p
|
return p
|
||||||
|
|
||||||
|
|
|
@ -6,39 +6,39 @@ from .settings import logger
|
||||||
|
|
||||||
class Loader:
|
class Loader:
|
||||||
def __init__(self, filename):
|
def __init__(self, filename):
|
||||||
logger.info("Loading configuration from " + filename)
|
logger.info('Loading configuration from ' + filename)
|
||||||
with open(filename) as f:
|
with open(filename) as f:
|
||||||
self.dict = yaml.load(f)
|
self.dict = yaml.load(f)
|
||||||
self.bots = []
|
self.bots = []
|
||||||
|
|
||||||
def load_bot_template(self, name, channel, serv, port):
|
def load_bot_template(self, name, channel, serv, port):
|
||||||
template = self.dict["bots"][name]
|
template = self.dict['bots'][name]
|
||||||
b = Bot(nickname=name)
|
b = Bot(nickname=name)
|
||||||
b.server = serv
|
b.server = serv
|
||||||
b.channel = channel
|
b.channel = channel
|
||||||
b.port = port
|
b.port = port
|
||||||
for ping in template.get("on_ping", []):
|
for ping in template.get('on_ping', []):
|
||||||
b.add_ping(ping)
|
b.add_ping(ping)
|
||||||
for ping in template.get("on_ping_python", []):
|
for ping in template.get('on_ping_python', []):
|
||||||
b.add_python_ping(ping)
|
b.add_python_ping(ping)
|
||||||
|
|
||||||
matches = template.get("on_match", [])
|
matches = template.get('on_match', [])
|
||||||
for match in matches:
|
for match in matches:
|
||||||
b.add_reaction(match, matches[match])
|
b.add_reaction(match, matches[match])
|
||||||
for match in template.get("on_match_python", []):
|
for match in template.get('on_match_python', []):
|
||||||
b.add_python_reaction(match, matches[match])
|
b.add_python_reaction(match, matches[match])
|
||||||
|
|
||||||
b.on_join = template.get("on_join", None)
|
b.on_join = template.get('on_join', None)
|
||||||
b.min_time = template.get("min_time", 20)
|
b.min_time = template.get('min_time', 20)
|
||||||
|
|
||||||
return b
|
return b
|
||||||
|
|
||||||
def load_bots(self):
|
def load_bots(self):
|
||||||
for channel in self.dict["channels"]:
|
for channel in self.dict['channels']:
|
||||||
name = channel["channel"]
|
name = channel['channel']
|
||||||
serv = channel["server"]
|
serv = channel['server']
|
||||||
port = channel.get("port", 6667)
|
port = channel.get('port', 6667)
|
||||||
bots_name = channel["bots"]
|
bots_name = channel['bots']
|
||||||
|
|
||||||
for nickname in bots_name:
|
for nickname in bots_name:
|
||||||
b = self.load_bot_template(nickname, name, serv, port)
|
b = self.load_bot_template(nickname, name, serv, port)
|
||||||
|
|
|
@ -4,7 +4,6 @@ from .loader import Loader
|
||||||
from .irc import IRCBotFactory
|
from .irc import IRCBotFactory
|
||||||
from .settings import logger, BOT_FILE
|
from .settings import logger, BOT_FILE
|
||||||
|
|
||||||
|
|
||||||
class Runner:
|
class Runner:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.loader = Loader(BOT_FILE)
|
self.loader = Loader(BOT_FILE)
|
||||||
|
@ -16,8 +15,7 @@ class Runner:
|
||||||
reactor.connectTCP(bot.server, bot.port, bot_factory)
|
reactor.connectTCP(bot.server, bot.port, bot_factory)
|
||||||
reactor.run()
|
reactor.run()
|
||||||
|
|
||||||
|
|
||||||
def run():
|
def run():
|
||||||
logger.info("Klafirc is running !")
|
logger.info('Klafirc is running !')
|
||||||
runner = Runner()
|
runner = Runner()
|
||||||
runner.run()
|
runner.run()
|
||||||
|
|
|
@ -4,11 +4,11 @@ from logging.handlers import RotatingFileHandler
|
||||||
DEBUG = True
|
DEBUG = True
|
||||||
|
|
||||||
if not DEBUG:
|
if not DEBUG:
|
||||||
BOT_FILE = "/etc/klafirc/bots.yaml"
|
BOT_FILE = '/etc/klafirc/bots.yaml'
|
||||||
LOG_FILE = "/var/log/klafirc/klafirc.log"
|
LOG_FILE = '/var/log/klafirc/klafirc.log'
|
||||||
else:
|
else:
|
||||||
BOT_FILE = "./bots.yaml"
|
BOT_FILE = './bots.yaml'
|
||||||
LOG_FILE = "./klafirc.log"
|
LOG_FILE = './klafirc.log'
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@ if DEBUG:
|
||||||
else:
|
else:
|
||||||
logger.setLevel(logging.INFO)
|
logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
formatter = logging.Formatter("%(asctime)s :: %(levelname)s :: %(message)s")
|
formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
|
||||||
file_handler = RotatingFileHandler(LOG_FILE, "a", 1000000, 1)
|
file_handler = RotatingFileHandler(LOG_FILE, 'a', 1000000, 1)
|
||||||
file_handler.setLevel(logging.DEBUG)
|
file_handler.setLevel(logging.DEBUG)
|
||||||
file_handler.setFormatter(formatter)
|
file_handler.setFormatter(formatter)
|
||||||
logger.addHandler(file_handler)
|
logger.addHandler(file_handler)
|
||||||
|
|
18
setup.py
18
setup.py
|
@ -1,19 +1,19 @@
|
||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="Klafirc",
|
name='Klafirc',
|
||||||
version="0.1",
|
version="0.1",
|
||||||
long_description=open("README.md").read(),
|
long_description=open('README.md').read(),
|
||||||
url="http://gitlab.rezometz.org/klafyvel/klafirc",
|
url='http://gitlab.rezometz.org/klafyvel/klafirc',
|
||||||
author="klafyvel",
|
author='klafyvel',
|
||||||
author_email="me@klafyvel.me",
|
author_email="me@klafyvel.me",
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
packages=find_packages(),
|
packages=find_packages(),
|
||||||
install_requires=open("requirements.txt").read().split("\n"),
|
install_requires= open('requirements.txt').read().split('\n'),
|
||||||
classifier=[
|
classifier=[
|
||||||
"Development Status :: 4 - Beta",
|
'Development Status :: 4 - Beta',
|
||||||
"Operating System :: POSIX :: Linux",
|
'Operating System :: POSIX :: Linux',
|
||||||
"Programming Language :: Python :: 3",
|
'Programming Language :: Python :: 3',
|
||||||
"Topic :: Utilities",
|
'Topic :: Utilities',
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue