Response class is now part of 'more' module.
This commit prepare the new message flow based on protocol independent messages. This commit changes the module API: you need to import the Response class manually at the begining of our module.
This commit is contained in:
parent
8f620b9756
commit
41da1c0780
37 changed files with 257 additions and 233 deletions
|
|
@ -10,6 +10,8 @@ from hooks import hook
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def load(context):
|
||||
"""Load this module"""
|
||||
global DATAS
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@ from xmlparser.node import ModuleState
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def load(context):
|
||||
global DATAS
|
||||
DATAS.setIndex("name", "birthday")
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ from tools.countdown import countdown_format
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
yr = datetime.today().year
|
||||
yrn = datetime.today().year + 1
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ from tools import web
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def load(context):
|
||||
if not CONF or not CONF.hasNode("goodreadsapi") or not CONF.getNode("goodreadsapi").hasAttribute("key"):
|
||||
print ("You need a Goodreads API key in order to use this "
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@ from collections import defaultdict
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
s = [('present', '0'), ('présent', '0'), ('pr', '0'),
|
||||
('passé simple', '12'), ('passe simple', '12'), ('ps', '12'),
|
||||
('passé antérieur', '112'), ('passe anterieur', '112'), ('pa', '112'),
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ from hooks import hook
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
from . import DDGSearch
|
||||
from . import UrbanDictionnary
|
||||
from . import WFASearch
|
||||
|
|
|
|||
|
|
@ -11,13 +11,15 @@ import time
|
|||
import threading
|
||||
import traceback
|
||||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from event import ModuleEvent
|
||||
from hooks import hook
|
||||
from tools.date import extractDate
|
||||
from tools.countdown import countdown_format, countdown
|
||||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def help_full ():
|
||||
return "This module store a lot of events: ny, we, " + (", ".join(DATAS.index.keys())) + "\n!eventslist: gets list of timer\n!start /something/: launch a timer"
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@ from hooks import hook
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def help_full ():
|
||||
return "!github /repo/: Display information about /repo/.\n!github_user /user/: Display information about /user/."
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ from hooks import hook
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def help_full():
|
||||
return "Search a movie title with: !imdbs <approximative title> ; View movie details with !imdb <title>"
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ from hooks import hook
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def help_tiny():
|
||||
"""Line inserted in the response to the command !help"""
|
||||
return "Read manual pages on IRC"
|
||||
|
|
|
|||
|
|
@ -7,6 +7,8 @@ from urllib.request import urlopen
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def load(context):
|
||||
if not CONF or not CONF.hasNode("mapquestapi") or not CONF.getNode("mapquestapi").hasAttribute("key"):
|
||||
print ("You need a MapQuest API key in order to use this "
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@ from tools.web import striphtml
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def get_raw_page(site, term, ssl=False):
|
||||
# Built IRL
|
||||
url = "http%s://%s/w/api.php?format=json&redirects&action=query&prop=revisions&rvprop=content&titles=%s" % (
|
||||
|
|
|
|||
175
modules/more.py
175
modules/more.py
|
|
@ -18,22 +18,195 @@
|
|||
|
||||
"""Progressive display of very long messages"""
|
||||
|
||||
import logging
|
||||
|
||||
from hooks import hook
|
||||
|
||||
nemubotversion = 3.4
|
||||
|
||||
logger = logging.getLogger("nemubot.response")
|
||||
|
||||
class Response:
|
||||
def __init__(self, message=None, channel=None, nick=None, server=None,
|
||||
nomore="No more message", title=None, more="(suite) ",
|
||||
count=None, ctcp=False, shown_first_count=-1,
|
||||
line_treat=None):
|
||||
self.nomore = nomore
|
||||
self.more = more
|
||||
self.line_treat = line_treat
|
||||
self.rawtitle = title
|
||||
self.server = server
|
||||
self.messages = list()
|
||||
self.alone = True
|
||||
self.is_ctcp = ctcp
|
||||
if message is not None:
|
||||
self.append_message(message, shown_first_count=shown_first_count)
|
||||
self.elt = 0 # Next element to display
|
||||
|
||||
self.sender = None
|
||||
self.channel = channel
|
||||
self.nick = nick
|
||||
self.count = count
|
||||
|
||||
@property
|
||||
def receivers(self):
|
||||
if self.channel is None:
|
||||
if self.nick is not None:
|
||||
return [ self.nick ]
|
||||
return [ self.sender.split("!")[0] ]
|
||||
elif isinstance(self.channel, list):
|
||||
return self.channel
|
||||
else:
|
||||
return [ self.channel ]
|
||||
|
||||
def set_sender(self, sender):
|
||||
if sender is None or sender.find("!") < 0:
|
||||
if sender is not None:
|
||||
logger.warn("Bad sender provided in Response, it will be ignored.", stack_info=True)
|
||||
self.sender = None
|
||||
else:
|
||||
self.sender = sender
|
||||
|
||||
def append_message(self, message, title=None, shown_first_count=-1):
|
||||
if type(message) is str:
|
||||
message = message.split('\n')
|
||||
if len(message) > 1:
|
||||
for m in message:
|
||||
self.append_message(m)
|
||||
return
|
||||
else:
|
||||
message = message[0]
|
||||
if message is not None and len(message) > 0:
|
||||
if shown_first_count >= 0:
|
||||
self.messages.append(message[:shown_first_count])
|
||||
message = message[shown_first_count:]
|
||||
self.messages.append(message)
|
||||
self.alone = self.alone and len(self.messages) <= 1
|
||||
if isinstance(self.rawtitle, list):
|
||||
self.rawtitle.append(title)
|
||||
elif title is not None:
|
||||
rawtitle = self.rawtitle
|
||||
self.rawtitle = list()
|
||||
for osef in self.messages:
|
||||
self.rawtitle.append(rawtitle)
|
||||
self.rawtitle.pop()
|
||||
self.rawtitle.append(title)
|
||||
|
||||
def append_content(self, message):
|
||||
if message is not None and len(message) > 0:
|
||||
if self.messages is None or len(self.messages) == 0:
|
||||
self.messages = list(message)
|
||||
self.alone = True
|
||||
else:
|
||||
self.messages[len(self.messages)-1] += message
|
||||
self.alone = self.alone and len(self.messages) <= 1
|
||||
|
||||
@property
|
||||
def empty(self):
|
||||
return len(self.messages) <= 0
|
||||
|
||||
@property
|
||||
def title(self):
|
||||
if isinstance(self.rawtitle, list):
|
||||
return self.rawtitle[0]
|
||||
else:
|
||||
return self.rawtitle
|
||||
|
||||
def pop(self):
|
||||
self.messages.pop(0)
|
||||
self.elt = 0
|
||||
if isinstance(self.rawtitle, list):
|
||||
self.rawtitle.pop(0)
|
||||
if len(self.rawtitle) <= 0:
|
||||
self.rawtitle = None
|
||||
|
||||
def treat_ctcp(self, content):
|
||||
if self.is_ctcp:
|
||||
return "\x01" + content + "\x01"
|
||||
else:
|
||||
return content
|
||||
|
||||
def get_message(self):
|
||||
if self.alone and len(self.messages) > 1:
|
||||
self.alone = False
|
||||
|
||||
if self.empty:
|
||||
return self.treat_ctcp(self.nomore)
|
||||
|
||||
if self.line_treat is not None and self.elt == 0:
|
||||
self.messages[0] = self.line_treat(self.messages[0]).replace("\n", " ").strip()
|
||||
|
||||
msg = ""
|
||||
if self.channel is not None and self.nick is not None:
|
||||
msg += self.nick + ": "
|
||||
|
||||
if self.title is not None:
|
||||
if self.elt > 0:
|
||||
msg += self.title + " " + self.more + ": "
|
||||
else:
|
||||
msg += self.title + ": "
|
||||
|
||||
if self.elt > 0:
|
||||
msg += "[…] "
|
||||
|
||||
elts = self.messages[0][self.elt:]
|
||||
if isinstance(elts, list):
|
||||
for e in elts:
|
||||
if len(msg) + len(e) > 430:
|
||||
msg += "[…]"
|
||||
self.alone = False
|
||||
return self.treat_ctcp(msg)
|
||||
else:
|
||||
msg += e + ", "
|
||||
self.elt += 1
|
||||
self.pop()
|
||||
return self.treat_ctcp(msg[:len(msg)-2])
|
||||
|
||||
else:
|
||||
if len(elts.encode()) <= 432:
|
||||
self.pop()
|
||||
if self.count is not None:
|
||||
return self.treat_ctcp(msg + elts + (self.count % len(self.messages)))
|
||||
else:
|
||||
return self.treat_ctcp(msg + elts)
|
||||
|
||||
else:
|
||||
words = elts.split(' ')
|
||||
|
||||
if len(words[0].encode()) > 432 - len(msg.encode()):
|
||||
self.elt += 432 - len(msg.encode())
|
||||
return self.treat_ctcp(msg + elts[:self.elt] + "[…]")
|
||||
|
||||
for w in words:
|
||||
if len(msg.encode()) + len(w.encode()) > 431:
|
||||
msg += "[…]"
|
||||
self.alone = False
|
||||
return self.treat_ctcp(msg)
|
||||
else:
|
||||
msg += w + " "
|
||||
self.elt += len(w) + 1
|
||||
self.pop()
|
||||
return self.treat_ctcp(msg)
|
||||
|
||||
|
||||
SERVERS = dict()
|
||||
|
||||
@hook("all_post")
|
||||
def parseresponse(res):
|
||||
# TODO: handle inter-bot communication NOMORE
|
||||
# TODO: check that the response is not the one already saved
|
||||
rstr = res.get_message()
|
||||
|
||||
if not res.alone:
|
||||
if res.server not in SERVERS:
|
||||
SERVERS[res.server] = dict()
|
||||
for receiver in res.receivers:
|
||||
SERVERS[res.server][receiver] = res
|
||||
return res
|
||||
|
||||
ret = list()
|
||||
for channel in res.receivers:
|
||||
ret.append("%s %s :%s" % ("NOTICE" if res.is_ctcp else "PRIVMSG", channel, rstr))
|
||||
return ret
|
||||
|
||||
|
||||
@hook("cmd_hook", "more")
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@ from tools import web
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def load(context):
|
||||
if not CONF or not CONF.hasNode("whoisxmlapi") or not CONF.getNode("whoisxmlapi").hasAttribute("username") or not CONF.getNode("whoisxmlapi").hasAttribute("password"):
|
||||
print ("You need a WhoisXML API account in order to use the "
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import urllib
|
|||
nemubotversion = 3.4
|
||||
|
||||
from hooks import hook
|
||||
from more import Response
|
||||
|
||||
def help_full():
|
||||
return "!subreddit /subreddit/: Display information on the subreddit."
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ from hooks import hook
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
@hook("cmd_hook", "choice")
|
||||
def cmd_choice(msg):
|
||||
if len(msg.cmds) > 1:
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@ from tools.web import striphtml
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def help_full ():
|
||||
return "!tcode <transaction code|keywords>"
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@ from hooks import hook
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def help_full():
|
||||
return "If you would like to sleep soon, use !sleepytime to know the best time to wake up; use !sleepytime hh:mm if you want to wake up at hh:mm"
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ from hooks import hook
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def load(context):
|
||||
global DATAS
|
||||
DATAS.setIndex("name", "phone")
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@ from .pyaspell import AspellError
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def help_full():
|
||||
return "!spell [<lang>] <word>: give the correct spelling of <word> in <lang=fr>."
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@ from tools import web
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def help_full():
|
||||
return "!syno <word>: give a list of synonyms for <word>."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@ from urllib.request import urlopen
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
import xmlparser
|
||||
|
||||
LANG = ["ar", "zh", "cz", "en", "fr", "gr", "it",
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ from tools import web
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def load(context):
|
||||
global DATAS
|
||||
DATAS.setIndex("name", "station")
|
||||
|
|
|
|||
|
|
@ -15,10 +15,11 @@ from urllib.parse import urlparse
|
|||
|
||||
from hooks import hook
|
||||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from networking import w3m
|
||||
from .atom import Atom
|
||||
|
||||
nemubotversion = 3.4
|
||||
from more import Response
|
||||
|
||||
def help_full ():
|
||||
return "This module is autonomous you can't interract with it."
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@ import mapquest
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def load(context):
|
||||
global DATAS
|
||||
DATAS.setIndex("name", "city")
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ from urllib.request import urlopen
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
from hooks import hook
|
||||
|
||||
API_URL="http://worldcup.sfg.io/%s"
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@ from hooks import hook
|
|||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def help_full():
|
||||
return "!ycc [<url>]: with an argument, reduce the given <url> thanks to ycc.fr; without argument, reduce the last URL said on the current channel."
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue