Commit 50d2ee7a authored by Mindiell's avatar Mindiell

Nettoyage et suppression des demandes de mode opérateur

parent b9e01d1a
...@@ -27,13 +27,13 @@ class IrcClientFactory(protocol.ClientFactory): ...@@ -27,13 +27,13 @@ class IrcClientFactory(protocol.ClientFactory):
def __init__(self, config): def __init__(self, config):
self.config = config self.config = config
def set_privmsg(self): def set_callbacks(self):
pass pass
def buildProtocol(self, addr): def buildProtocol(self, addr):
print("Building protocol") print("Building protocol")
self.client = IrcClient(self.config) self.client = IrcClient(self.config)
self.set_privmsg() self.set_callbacks()
return self.client return self.client
def clientConnectionLost(self, connector, reason): def clientConnectionLost(self, connector, reason):
......
#encoding: utf-8
"""
Channel operator methods.
"""
import re
import config
from logs import Log
class Op():
def __init__(self):
# Sequence for op_mode verification (fibonacci)
self.op_sequence = [1, 2, 3, 5, 8, 13, 21, 34, 55]
self.op_offset = 0
self.op_counter = 0
def need_op_mode(self, me, params):
"""
Send a message on channel RP_CHANNEL to beg an op mode to each actual operators.
params is an array with :
- params[0]:
- params[1]:
- params[2]: the channel
- params[3]: the list of all users on the channel
"""
Log.debug("Names : %s" % params)
message = ""
if params[2]==config.RP_CHANNEL:
ops = [user[1:] for user in params[3].split() if user[0]=="@"]
if me not in params[3]:
# Testing based on fibonacci sequence
self.op_counter += 1
Log.debug("op_counter : %s" % self.op_counter)
Log.debug("op_offset : %s" % self.op_offset)
Log.debug("op_sequence : %s" % self.op_sequence[self.op_offset])
if self.op_counter>self.op_sequence[self.op_offset]:
message = "%s j'ai besoin d'être op pour modifier le topic, ne m'oubliez pas s'il vous plait !" % ", ".join(ops)
# Then reset op_counter
self.op_counter = 0
# And move the sequence further in order not to spam channel
if self.op_offset<len(self.op_sequence)-1:
self.op_offset += 1
return message
def get_op_mode(self, user, flag_set):
# Cleaning user name
user = re.search("([^!]*)!", user).group(1)
if flag_set:
# reset counter and sequence
self.op_counter = 0
self.op_offset = 0
# thanks to user
return "Merci %s <3" % user
else:
# bad user ;o(
return "Vilain %s )o;" % user
...@@ -58,8 +58,6 @@ class Rp(): ...@@ -58,8 +58,6 @@ class Rp():
next_week.tm_mday, next_week.tm_mday,
time.tzname[0] time.tzname[0]
), "%Y-%m-%d %Z") ), "%Y-%m-%d %Z")
# Number of press review articles actually waiting
self.number = None
# default last_entry_published for tweets # default last_entry_published for tweets
self.last_entry_published = time.strptime("2000-01-01", "%Y-%m-%d") self.last_entry_published = time.strptime("2000-01-01", "%Y-%m-%d")
# See if there is a later last_entry_published for tweets # See if there is a later last_entry_published for tweets
...@@ -140,7 +138,6 @@ class Rp(): ...@@ -140,7 +138,6 @@ class Rp():
if necessary. if necessary.
""" """
Log.debug("count_articles method") Log.debug("count_articles method")
topic = ""
cursor = get_cursor() cursor = get_cursor()
cursor.execute("""SELECT COUNT(*) FROM presse cursor.execute("""SELECT COUNT(*) FROM presse
WHERE DATE_SUB(NOW(), INTERVAL 2 MONTH)<datec WHERE DATE_SUB(NOW(), INTERVAL 2 MONTH)<datec
...@@ -149,10 +146,7 @@ class Rp(): ...@@ -149,10 +146,7 @@ class Rp():
rows = cursor.fetchall() rows = cursor.fetchall()
number = int(rows[0][0]) number = int(rows[0][0])
Log.debug("Found %s articles." % number) Log.debug("Found %s articles." % number)
if self.number != number: return "Canal de la revue de presse de La Quadrature du Net ~ %s articles en attente ~ Mode d'emploi https://wiki.laquadrature.net/Revue_de_presse ~ Une arme, le savoir est. Le diffuser, notre devoir c'est." % number
topic = "Canal de la revue de presse de La Quadrature du Net ~ %s articles en attente ~ Mode d'emploi https://wiki.laquadrature.net/Revue_de_presse ~ Une arme, le savoir est. Le diffuser, notre devoir c'est." % number
self.number = number
return topic
def clean_master_rp(self): def clean_master_rp(self):
""" """
......
...@@ -18,7 +18,6 @@ from logs import Log ...@@ -18,7 +18,6 @@ from logs import Log
from admin import Admin from admin import Admin
from fun import fun from fun import fun
from monitor import Monitor from monitor import Monitor
from op import Op
from rp import Rp from rp import Rp
class Wantzel(object): class Wantzel(object):
...@@ -31,13 +30,13 @@ class Wantzel(object): ...@@ -31,13 +30,13 @@ class Wantzel(object):
""" """
self.admin = Admin() self.admin = Admin()
self.monitor = Monitor() self.monitor = Monitor()
self.op = Op()
self.rp = Rp() self.rp = Rp()
# Connection to IRC # Connection to IRC
self.irc = IrcClientFactory(config) self.irc = IrcClientFactory(config)
self.irc.set_privmsg = self.set_privmsg self.irc.set_callbacks = self.set_callbacks
reactor.connectSSL(config.server, config.port, self.irc, ssl.ClientContextFactory()) reactor.connectSSL(config.server, config.port, self.irc, ssl.ClientContextFactory())
self.test_timer = "" self.test_timer = ""
self.topic = ""
# Loop call # Loop call
self.loop_started = False self.loop_started = False
self.loop = task.LoopingCall(self.timer) self.loop = task.LoopingCall(self.timer)
...@@ -56,58 +55,23 @@ class Wantzel(object): ...@@ -56,58 +55,23 @@ class Wantzel(object):
# Bot tries to list RP channel users, if it can't, then it is no more an op and shall # Bot tries to list RP channel users, if it can't, then it is no more an op and shall
# complain # complain
self.irc.client.sendLine("NAMES %s" % config.RP_CHANNEL) self.irc.client.sendLine("NAMES %s" % config.RP_CHANNEL)
# Update topic based on number of articles waiting in queue # Update topic based on number of articles waiting in queue if necessary
topic = self.rp.count_articles() topic = self.rp.count_articles()
if topic != "": if topic != self.topic:
self.irc.client.topic(config.RP_CHANNEL, topic) self.irc.client.topic(config.RP_CHANNEL, topic)
# Tell on channel if a wiki was modified since last time # Tell on channel if a wiki was modified since last time
self.send_message("#lqdn-travail", self.monitor.wiki_updates()) self.send_message("#lqdn-travail", self.monitor.wiki_updates())
# Cleaning points of mastering rp # Cleaning points of mastering rp
self.rp.clean_master_rp() self.rp.clean_master_rp()
def set_privmsg(self): def set_callbacks(self):
""" """
This method set the methods to call for each callback received from IRC. This method set the methods to call for each callback received from IRC.
""" """
# When receiving a message # When receiving a message
self.irc.client.privmsg = self.on_privmsg self.irc.client.privmsg = self.on_privmsg
# When the bot discover it is no more op # When topic is modified
self.irc.client.irc_unknown = self.irc_unknown self.irc.client.topicUpdated = self.topic_updated
# When bot mode is changed
self.irc.client.modeChanged = self.mode_changed
# When bot nickname is changed
self.irc.client.nickChanged = self.nick_changed
def nick_changed(self, nick):
"""
Callback called whenever bot nickname is changed.
"""
Log.debug("Nick changed : %s" % (nick))
if nick!=config.nickname:
self.irc.client.setNick(config.nickname)
def mode_changed(self, user, channel, flag_set, modes, args):
"""
Callback called whenever bot mode is changed.
"""
Log.debug("Mode changed : %s %s %s %s %s" % (user, channel, flag_set, modes, args))
if "o" in modes and self.irc.client.nickname in args:
self.send_message(channel, self.op.get_op_mode(user, flag_set))
def irc_unknown(self, prefix, command, params):
"""
This Callback is called whenever the bot tries to perform the command "NAMES" on the
RP_CHANNEL channel. If it occurs, then the bot knows that it is no more op and beg for
a mode change to actual operators on the channel.
"""
Log.debug("UNKNOWN %s %s %s" % (prefix, command, params))
if command=="RPL_NAMREPLY":
# Launch loop if necessary
if not self.loop_started:
self.loop.start(config.timer)
self.loop_started = True
# Beg for operator mode ?
self.send_message(params[2], self.op.need_op_mode("@"+self.irc.client.nickname, params))
def send_message(self, channel, multiline_message=""): def send_message(self, channel, multiline_message=""):
""" """
...@@ -118,6 +82,17 @@ class Wantzel(object): ...@@ -118,6 +82,17 @@ class Wantzel(object):
for message in multiline_message.splitlines(): for message in multiline_message.splitlines():
self.irc.client.msg(channel, message) self.irc.client.msg(channel, message)
def topic_updated(self, user, channel, newTopic):
"""
Topic has been modified, or bot is coming in the channel.
If the bot is coming in, we can start its timer's loop
"""
self.topic = newTopic
# Can I start the loop ?
if not self.loop_started:
self.loop_started = True
self.loop.start(config.timer)
def on_privmsg(self, user, channel, msg): def on_privmsg(self, user, channel, msg):
""" """
Wantzel can understand a lot of commands. Commands followed by a (*) Wantzel can understand a lot of commands. Commands followed by a (*)
...@@ -205,63 +180,63 @@ class Wantzel(object): ...@@ -205,63 +180,63 @@ class Wantzel(object):
command = re.search("[!~]help (help|rp|status|stats|kill|admin)", msg) command = re.search("[!~]help (help|rp|status|stats|kill|admin)", msg)
if command: if command:
command = command.group(1) command = command.group(1)
print(command)
if command=="help": if command=="help":
self.send_message( self.send_message(
user, channel,
"""Bravo! """Bravo %s!
Tu viens d'entrer dans le monde récursif où l'aide sert à expliciter l'aide.""" Tu viens d'entrer dans le monde récursif où l'aide sert à expliciter l'aide.""" % user
) )
elif command=="rp": elif command=="rp":
self.send_message( self.send_message(
user, channel,
"""Cette commande sert à ajouter un article à la Revue de Presse (https://wiki.laquadrature.net/Revue_de_presse) """%s, cette commande sert à ajouter un article à la Revue de Presse (https://wiki.laquadrature.net/Revue_de_presse)
L'utilisation se fait sous la forme: ~rp(cpa) <url de l'article à ajouter>""" L'utilisation se fait sous la forme: ~rp(cpa) <url de l'article à ajouter>""" % user
) )
elif command=="status": elif command=="status":
self.send_message( self.send_message(
user, channel,
"""Cette commande sert à retrouver les informations concernant un article ajouté à la Revue de Presse (https://wiki.laquadrature.net/Revue_de_presse) """%s, cette commande sert à retrouver les informations concernant un article ajouté à la Revue de Presse (https://wiki.laquadrature.net/Revue_de_presse)
L'utilisation se fait sous la forme: ~status <url de l'article>""" L'utilisation se fait sous la forme: ~status <url de l'article>""" % user
) )
elif command=="stats": elif command=="stats":
self.send_message( self.send_message(
user, channel,
"""Cette commande permet de fournir quelques statistiques sur la Revue de Presse (https://wiki.laquadrature.net/Revue_de_presse) """%s, cette commande permet de fournir quelques statistiques sur la Revue de Presse (https://wiki.laquadrature.net/Revue_de_presse)
Les statistiques sont calculées sur des notes supérieurs ou égales à 0, 3, et 4. Et sur les 1, 3, 7, et 15 derniers jours.""" Les statistiques sont calculées sur des notes supérieurs ou égales à 0, 3, et 4. Et sur les 1, 3, 7, et 15 derniers jours.""" % user
) )
elif command=="kill": elif command=="kill":
self.send_message( self.send_message(
user, channel,
"""*Attention* seuls les vrais rp-jedis ont accès à cette commande <3 """*Attention %s* seuls les vrais rp-jedis ont accès à cette commande <3
Fixe la note de l'article donné en paramètre à -100. Fixe la note de l'article donné en paramètre à -100.
Utile en cas d'erreur ou pour s'assurer que l'article ne sera pas publié dans la RP Utile en cas d'erreur ou pour s'assurer que l'article ne sera pas publié dans la RP
Utilisation: ~kill <url de l'article>""" Utilisation: ~kill <url de l'article>""" % user
) )
elif command=="admin": elif command=="admin":
self.send_message( self.send_message(
user, channel,
"""*Attention* seuls les vrais rp-jedis ont accès à cette commande <3 """*Attention %s* seuls les vrais rp-jedis ont accès à cette commande <3
Permet de gérer la liste des utilisateurs ayant un accès privilégié. Il n'y a qu'un seul niveau de privilège. Permet de gérer la liste des utilisateurs ayant un accès privilégié. Il n'y a qu'un seul niveau de privilège.
Utilisations: Utilisations:
~admin list => Fournit la liste des utilisateurs privilégiés ~admin list => Fournit la liste des utilisateurs privilégiés
~admin add user[, user]> => Ajoute un ou plusieurs utilisateurs à la liste ~admin add user[, user]> => Ajoute un ou plusieurs utilisateurs à la liste
~admin del user[, user] => Supprime un ou plusieurs utilisateurs de la liste ~admin del user[, user] => Supprime un ou plusieurs utilisateurs de la liste
~admin timer => Relance un timer pour gérer le topic et les tweets""" ~admin timer => Relance un timer pour gérer le topic et les tweets""" % user
) )
else: else:
self.send_message( self.send_message(
user, channel,
"""Désolé, je ne connais pas cette commande.""" """Désolé %s, je ne connais pas cette commande.""" % user
) )
else: else:
self.send_message( self.send_message(
user, channel,
"""Mes commandes sont : ~help ~rp(cpa) ~status ~kill ~stats et ~admin. """%s Mes commandes sont : ~help ~rp(cpa) ~status ~kill ~stats et ~admin.
Pour plus d'informations, voir ici: https://wiki.laquadrature.net/Wantzel Pour plus d'informations, voir ici: https://wiki.laquadrature.net/Wantzel
Pour obtenir de l'aide sur une commande en particulier, il suffit de taper ~help <commande>""" Pour obtenir de l'aide sur une commande en particulier, il suffit de taper ~help <commande>""" % user
) )
if __name__ == '__main__': if __name__ == '__main__':
Wantzel() Wantzel()
reactor.run() reactor.run()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment