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):
def __init__(self, config):
self.config = config
def set_privmsg(self):
def set_callbacks(self):
pass
def buildProtocol(self, addr):
print("Building protocol")
self.client = IrcClient(self.config)
self.set_privmsg()
self.set_callbacks()
return self.client
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():
next_week.tm_mday,
time.tzname[0]
), "%Y-%m-%d %Z")
# Number of press review articles actually waiting
self.number = None
# default last_entry_published for tweets
self.last_entry_published = time.strptime("2000-01-01", "%Y-%m-%d")
# See if there is a later last_entry_published for tweets
......@@ -140,7 +138,6 @@ class Rp():
if necessary.
"""
Log.debug("count_articles method")
topic = ""
cursor = get_cursor()
cursor.execute("""SELECT COUNT(*) FROM presse
WHERE DATE_SUB(NOW(), INTERVAL 2 MONTH)<datec
......@@ -149,10 +146,7 @@ class Rp():
rows = cursor.fetchall()
number = int(rows[0][0])
Log.debug("Found %s articles." % number)
if self.number != 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
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
def clean_master_rp(self):
"""
......
......@@ -18,7 +18,6 @@ from logs import Log
from admin import Admin
from fun import fun
from monitor import Monitor
from op import Op
from rp import Rp
class Wantzel(object):
......@@ -31,13 +30,13 @@ class Wantzel(object):
"""
self.admin = Admin()
self.monitor = Monitor()
self.op = Op()
self.rp = Rp()
# Connection to IRC
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())
self.test_timer = ""
self.topic = ""
# Loop call
self.loop_started = False
self.loop = task.LoopingCall(self.timer)
......@@ -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
# complain
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()
if topic != "":
if topic != self.topic:
self.irc.client.topic(config.RP_CHANNEL, topic)
# Tell on channel if a wiki was modified since last time
self.send_message("#lqdn-travail", self.monitor.wiki_updates())
# Cleaning points of mastering 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.
"""
# When receiving a message
self.irc.client.privmsg = self.on_privmsg
# When the bot discover it is no more op
self.irc.client.irc_unknown = self.irc_unknown
# 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))
# When topic is modified
self.irc.client.topicUpdated = self.topic_updated
def send_message(self, channel, multiline_message=""):
"""
......@@ -118,6 +82,17 @@ class Wantzel(object):
for message in multiline_message.splitlines():
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):
"""
Wantzel can understand a lot of commands. Commands followed by a (*)
......@@ -205,63 +180,63 @@ class Wantzel(object):
command = re.search("[!~]help (help|rp|status|stats|kill|admin)", msg)
if command:
command = command.group(1)
print(command)
if command=="help":
self.send_message(
user,
"""Bravo!
Tu viens d'entrer dans le monde récursif où l'aide sert à expliciter l'aide."""
channel,
"""Bravo %s!
Tu viens d'entrer dans le monde récursif où l'aide sert à expliciter l'aide.""" % user
)
elif command=="rp":
self.send_message(
user,
"""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>"""
channel,
"""%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>""" % user
)
elif command=="status":
self.send_message(
user,
"""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>"""
channel,
"""%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>""" % user
)
elif command=="stats":
self.send_message(
user,
"""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."""
channel,
"""%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.""" % user
)
elif command=="kill":
self.send_message(
user,
"""*Attention* seuls les vrais rp-jedis ont accès à cette commande <3
channel,
"""*Attention %s* seuls les vrais rp-jedis ont accès à cette commande <3
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
Utilisation: ~kill <url de l'article>"""
Utilisation: ~kill <url de l'article>""" % user
)
elif command=="admin":
self.send_message(
user,
"""*Attention* seuls les vrais rp-jedis ont accès à cette commande <3
channel,
"""*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.
Utilisations:
~admin list => Fournit la liste des utilisateurs privilégiés
~admin add user[, user]> => Ajoute un ou plusieurs utilisateurs à 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:
self.send_message(
user,
"""Désolé, je ne connais pas cette commande."""
channel,
"""Désolé %s, je ne connais pas cette commande.""" % user
)
else:
self.send_message(
user,
"""Mes commandes sont : ~help ~rp(cpa) ~status ~kill ~stats et ~admin.
channel,
"""%s Mes commandes sont : ~help ~rp(cpa) ~status ~kill ~stats et ~admin.
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__':
Wantzel()
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