Exemple #1
0
 def run(self, **kwargs):
     self.start()
     self._timer._status = "ok"
     self._timer._nrs.loops += 1
     event = Event()
     event.name = self._name
     event.origin = "clock@bot"
     self.func(event.parse())
Exemple #2
0
def timer(event):
    """ echo txt on a given time. """
    if not event._parsed.rest: return
    seconds = 0
    line = ""
    for word in event._parsed.args:
        if word.startswith("+"):
            try:
                seconds = int(word[1:])
            except:
                event.reply("%s is not an integer" % seconds)
                return
        else:
            line += word + " "
    if seconds: target = time.time() + seconds
    else:
        try:
            target = get_day(event._parsed.rest)
        except ENODATE:
            target = to_day(day())
        hour = get_hour(event._parsed.rest)
        if hour: target += hour
    if not target or time.time() > target:
        event.reply("already passed given time.")
        return
    e = Event()
    e.services = "clock"
    e.prefix = "timer"
    e.txt = event._parsed.rest
    e.time = target
    e.done = False
    e.save()
    timer = Timer(target, e.reply, e.txt)
    launcher.launch(timer.start)
    event.ok(time.ctime(target))
 def since(self, start, *args, **kwargs):
     """ return all object since a given time. """
     e = Event(**kwargs)
     e.start = start
     for fn in self.prefixed(*args, **e):
         try:
             obj = Object().load(fn)
         except:
             logging.warn("fail %s" % fn)
             continue
         if "deleted" in obj and obj.deleted: continue
         yield obj
Exemple #4
0
def re(event):
    try: t = parse_time(event._parsed.rest)
    except ValueError: t = None
    if not t: event.reply("since when ?") ; return
    for obj in storage.since("cblog", t):
        e = Event(obj)
        event.reply("%s %s %s" % (e.created.split()[3], e.nick or e.origin, e.txt))
def cmndrun(event):
    cfg.workdir = "test.data"
    for name in sorted(kernel.modules()):
        if name in ["meds.plugs.test", "meds.plugs.rss"]: continue
        mod = kernel.direct(name)
        for n in dir(mod):
            if n in exclude: continue
            func = getattr(mod, n, None)
            if func and type(func) in [types.FunctionType, types.MethodType]:
                if "event" in func.__code__.co_varnames:
                    e = Event()
                    e.btype = event.btype
                    e._funcs.append(func)
                    e.workdir = "test.data"
                    e.origin = "test@bot"
                    kernel.put(e)
Exemple #6
0
def init(event):
    for fn in storage.prefixed("timer"):
        e = Event().load(fn)
        if e.done: continue
        if "time" not in e: continue
        if time.time() < int(e.time):
            timer = Timer(int(e.time), e.announce, e.txt)
            launcher.launch(timer.start)
 def event(self):
     e = Event()
     e.server = self._cfg.server
     e.btype = sname(self)
     e.txt = input()
     e.txt = e.txt.rstrip()
     e.origin = "root@shell"
     return e
 def initialize(self, name):
     """ initialze package. """
     event = Event()
     thrs = []
     for modname in self.walk(name):
         n = modname.split(".")[-1]
         mod = self._table.get(modname, None)
         if not mod:
             mod = self.load(modname)
         if n in self._cfg.default:
             mod.init(event)
         if self._cfg.all or n in self._cfg.init.split(","):
             if n not in self._cfg.exclude.split(','):
                 logging.info("! init %s" % n)
                 thr = self.launch(mod.init,
                                   event,
                                   name="%s.initialize" % n)
                 thrs.append(thr)
     event.ready()
     return thrs
Exemple #9
0
 def test_cmnds(self):
     for cmnd in sorted(cmnds.handlers.keys()):
         if cmnd in ["test", "fetcher"]: continue
         event = Event()
         event.txt = cmnd + " arg1" 
         event._bot = bot
         event.origin = "tester@bot"
         event.parse()
         logging.warn("< %s" % event.txt)
         func = cmnds.get(event.cmnd)
         if func: launcher.launch(func, event)
         events.append(event)
     for event in events: event.wait(3.0) 
 def last(self, *args, **kwargs):
     """ return last record with a matching prefix. """
     e = Event(**kwargs)
     for fn in self.prefixed(*args, **kwargs)[::-1]:
         try:
             obj = Object().load(fn)
         except:
             logging.warn("fail %s" % fn)
             continue
         if "deleted" in obj and obj.deleted: continue
         if len(args) > 1 and obj.get(args[0]) != args[1]: continue
         return obj
def testcmnds(event):
    cfg.workdir = "test.data"
    for cmnd in sorted(kernel._handlers.keys()):
        e = Event()
        e.btype = event.btype
        e.txt = "%s %s" % (cmnd, randomname())
        e.origin = "test@bot"
        e.parse()
        event.reply("put %s" % e.txt)
        kernel.put(e)
 def scan(self, path, *args, **kwargs):
     """ scan all files in the cfg.main.workdir directory. """
     p = Event(**kwargs)
     if not path.endswith(os.sep): path += os.sep
     for root, dirs, files in os.walk(path, topdown=True):
         if not os.path.isdir(root): continue
         for fn in files:
             fnn = j(root, fn)
             timed = fn_time(fnn)
             if timed and p.start and timed < p.start: continue
             if timed and p.end and timed > p.end: continue
             yield fnn
Exemple #13
0
 def dccloop(self, event, s):
     sockfile = s.makefile('rw')
     #s.setblocking(True)
     self.register_fd(s)
     while 1:
         try:
             res = sockfile.readline()
             if not res: break
             res = res.rstrip()
             logging.info("< %s %s" % (event.origin, res))
             e = Event()
             e.btype = "DCC"
             e.txt = res
             e.outer = sockfile
             e.origin = event.origin
             super().dispatch(e)
         except socket.timeout:
             time.sleep(0.01)
         except socket.error as ex:
             if ex.errno in [
                     socket.EAGAIN,
             ]: continue
             else: raise
         except Exception as ex:
             logging.error(get_exception())
     sockfile.close()
 def event(self):
     event = Event()
     event.btype = sname(self)
     event.txt = str(os.read(fd, 512), "utf-8")
     event.txt = event.txt.rstrip()
     event.origin = "root@shell"
     yield event
Exemple #15
0
 def event(self):
     event = Event()
     event._bot = self
     event.txt = input(self.prompt())
     event.origin = "root@shell"
     event.parse()
     return event
Exemple #16
0
 def event(self, txt=""): 
     e = Event(txt=txt)
     e.txt = txt
     e.origin = "test@bot"
     e._bot = self
     e.parse()
     return e
Exemple #17
0
 def presenced(self, data):
     from meds.mods import cmnds
     logging.debug("< %s.read %s" % (self.type, data))
     o = Event()
     o.update(data)
     o._bot = self
     o["from"] = str(o["from"])
     o.origin = o["from"]
     if "txt" not in o: o.txt = ""
     o.element = "presence"
     if o.type == 'subscribe':
         pres = Event({'to': o["from"], 'type': 'subscribed'})
         self.client.send_presence(pres)
         pres = Event({'to': o["from"], 'type': 'subscribe'})
         self.client.send_presence(pres)
     elif o.type == "unavailable" and o.origin in self.channels: self.channels.remove(o.origin)
     elif o.origin != self.user and o.origin not in self.channels: self.channels.append(o.origin)
     o.no_dispatch = True
     logging.info("< %s.%s %s" % (self.type, o.type, o.origin))
     o.parse()
     func = cmnds.get(o.cmnd)
     if func: func(o)
Exemple #18
0
def cmndrun(event):
    for cmnd in sorted(list(cmnds.handlers.keys())):
        if cmnd in exclude: continue
        e = Event()
        e.txt = ("!" + cmnd)
        e._bot = event._bot
        e.workdir = "test.data"
        e.origin = "test@bot"
        e.parse()
        logging.warn("< %s" % e.txt)
        scheduler.dispatch(e)
Exemple #19
0
 def cmnd(self, txt):
     event = Event()
     event._server = self._cfg.server
     event.btype = sname(self)
     event.origin = "user@bot"
     event.txt = txt
     self.dispatch(event)
     return event
Exemple #20
0
 def reload(self, name, force=False, event=None):
     from meds.event import Event
     e = event or Event()
     if name not in self._table: self.load(name, True)
     n = name.split(".")[-1]
     if name in self._table and "shutdown" in dir(self._table[name]):
         self._table[name].shutdown(e)
         e.ready()
     if name not in self._table or force: self.load(name, True)
     else: self._table[name] = importlib.reload(self._table[name])
     if "init" in dir(self._table[name]):
         self._table[name].init(e)
         e.ready()
     return self._table[name]
Exemple #21
0
    def cmnd(self, txt, bot=None):
        from meds.event import Event

        event = Event()
        event.origin = "user@bot"
        event._bot = self
        event.txt = txt
        event.parse()
        scheduler.put(event)
        return event
def reboot(event):
    """ reboot the bot, allowing statefull reboot (keeping connections alive). """
    if not cfg.reboot:
        event.reply("reboot is not enabled")
        return
    if not users.allowed(event.origin, "REBOOT"):
        event.reply("you don't have reboot permissions.")
        return
    event.announce("rebooting")
    resume = Object()
    resume.kernel = kernel._resume
    resume.fleet = fleet
    resume.save("resume")
    e = Event()
    e._funcs.append(real_reboot)
    print(e)
    kernel.put(e)
 def shutdown(self, close=True):
     """ stop bots, services and plugins. """
     logging.debug("shutdown")
     event = Event()
     thrs = []
     for key, mod in self._table.items():
         if "meds.run" not in key:
             continue
         if "shutdown" in dir(mod):
             thr = self.launch(mod.shutdown, event)
             thrs.append(thr)
     for bot in meds.core.fleet:
         if "stop" in dir(bot):
             thr = self.launch(bot.stop)
             thrs.append(thr)
         if "exit" in dir(bot):
             thr = self.launch(bot.exit)
             thrs.append(thr)
         bot.ready()
     meds.core.launcher.waiter(thrs)
     self.killall()
     self.ready()
def stats(event, **kwargs):
    e = Event(kwargs)
    cfg = cfgs.get("stats", None)
    if not cfg:
        cfgs.stats = cfg = storage.last("cfg", "stats")
    name = event._parsed.rest or e.name
    if "." in name: name = name.split(".")[-1]
    name = name.lower()
    delta = time.time() - starttime
    awake = time.time() - today()
    needed = seconds(nr(name))
    if needed:
        nrtimes = int(delta / needed)
        txt = "%s #%s" % (name.upper(), nrtimes)
        if name in omschrijving: txt += " (%s)" % omschrijving.get(name)
        txt += " elke %s" % elapsed(seconds(nr(name)))
        if name in soort:
            txt += " door een %s" % soort.get(name, "slachtoffer")
        txt += " bijv. in %s" % random.choice(gemeenten)
        if name in tags: txt += " %s" % tags.get(name)
        if cfg and cfg.showurl and name in urls:
            txt += " - %s" % urls.get(name)
        event.announce(txt)
Exemple #25
0
 def dccloop(self, event, s):
     from meds.mods import cmnds
     sockfile = s.makefile('rw')
     s.setblocking(True)
     while 1:
         try:
             res = sockfile.readline()
             if not res: break
             res = res.rstrip()
             logging.info("< %s.loop %s" % (self.type, event.origin))
             e = Event()
             e._bot = self
             e.txt = res
             e.outer = sockfile
             e.origin = event.origin
             e.parse()
             func = cmnds.get(e.cmnd)
             if func: func(e)
         except socket.timeout: time.sleep(0.01)
         except socket.error as ex:
             if ex.errno in [socket.EAGAIN, ]: continue
             else: raise
         except Exception as ex: logging.error(get_exception())
     sockfile.close()
Exemple #26
0
 def parse(self, txt):
     rawstr = str(txt)
     logging.debug("< %s/parse %s" % (self.type, rawstr))
     obj = Event()
     obj._bot = self
     obj.arguments = rawstr.split(":")[0].split()
     if not obj.arguments: obj.arguments = rawstr.split(":")[1].split()
     obj.txt = rawstr.split(":", 2)[-1]
     if rawstr[0] == ":": obj.origin = obj.arguments[0] ; obj.cmnd = obj.arguments[1]
     else: obj.origin = self.server ; obj.cmnd = obj.arguments[0]
     try: obj.nick, obj.userhost = obj.origin.split("!")
     except: pass
     obj.target = obj.arguments[-1]
     if obj.target.startswith("#"): obj.channel = obj.target
     return obj
Exemple #27
0
def timer(event):
    if not event.rest: return
    day = get_day(event.rest) or today()
    hour = get_hour(event.rest)
    target = day + get_hour(event.rest)
    if time.time() > target: event.reply("already passed given time.") ; return
    event.reply("time is %s" % time.ctime(target))
    e = Event()
    e._bot = event._bot
    e.services = "clock"
    e.prefix = "timer"
    e.txt = event.rest
    e.time = target
    e.done = False
    e.save()
    timer = Timer(target, e.parse())
    launcher.launch(timer.start)
    e.ok()
Exemple #28
0
 def messaged(self, data):
     from meds.mods import cmnds
     logging.debug("< %s.read %s" % (self.type, data))
     m = Event()
     m.update(data)
     m._bot = self
     if m.type == "error": logging.error("^ %s" % m.error) ; return
     m.cc = self.cc
     m["from"] = str(m["from"])
     if self.user in m["from"]: logging.info("< %s.%s %s" % (self.type, m.type, m["from"])) ; return
     m.origin = m["from"]
     m.channel = m.origin
     m.to = m.origin
     m.element = "message"
     m.txt = m["body"]
     if '<delay xmlns="urn:xmpp:delay"' in str(data):
         logging.info("# %s.ignore %s %s" % (self.type, m.type, m.origin))
         return
     logging.info("< %s.%s %s" % (self.type, m.type, m.origin))
     m.parse()
     func = cmnds.get(m.cmnd)
     if func: func(m)
Exemple #29
0
 def parsing(self, txt):
     rawstr = str(txt)
     obj = Event()
     obj.server = self._cfg.server
     obj.cc = self.cc
     obj.btype = sname(self)
     obj.arguments = []
     arguments = rawstr.split()
     obj.origin = arguments[0]
     if obj.origin.startswith(":"):
         obj.origin = obj.origin[1:]
         if len(arguments) > 1: obj.command = arguments[1]
         if len(arguments) > 2:
             txtlist = []
             adding = False
             for arg in arguments[2:]:
                 if arg.startswith(":"):
                     adding = True
                     txtlist.append(arg[1:])
                     continue
                 if adding: txtlist.append(arg)
                 else: obj.arguments.append(arg)
             obj.txt = " ".join(txtlist)
     else:
         obj.command = obj.origin
         obj.origin = self._cfg.server
     try:
         obj.nick, obj.userhost = obj.origin.split("!")
     except:
         pass
     if obj.arguments: obj.target = obj.arguments[-1]
     else: obj.target = ""
     if obj.target.startswith("#"): obj.channel = obj.target
     if not obj.txt and len(arguments) == 1: obj.txt = arguments[1]
     if not obj.txt: obj.txt = rawstr.split(":")[-1]
     return obj
def testcfg(event):
    cfg.workdir = event._parsed.rest
    e = Event()
    path = e.save()
    event.reply(path)