BastliBridge

A bot framework bridgin multiple IM protocols, and mail
git clone git://xatko.vsos.ethz.ch/BastliBridge.git
Log | Files | Refs | Submodules

commit 53716243fbcf322b2e0d5551436d6ddc0960e115
parent ce38c2cefad48b5f528eca41f23cbf6ae5cf3cc7
Author: Dominik Schmidt <das1993@hotmail.com>
Date:   Wed,  5 Sep 2018 09:44:52 +0000

Smaller corrections and improvements

Diffstat:
src/bastlibridge/base.d | 6++++++
src/bastlibridge/bot.d | 2+-
src/bastlibridge/command.d | 7++++++-
src/bastlibridge/interfaces/telegram.d | 25+++++++++++++++++++------
src/bastlibridge/manager.d | 2++
src/telegram/telegram.d | 2+-
6 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/src/bastlibridge/base.d b/src/bastlibridge/base.d @@ -143,6 +143,9 @@ struct Port{ string toString() const{ return format("%s:%s", ep.name, chan._name); } + bool valid(){ + return ep !is null && chan !is null; + } } abstract class Message{ @@ -153,6 +156,9 @@ abstract class Message{ abstract bool auth(); abstract SysTime getTime(); abstract void respond(in char[] response); + Port getPort(){ + return Port(source, source.getChannel(getChannelName())); + } } struct EndpointTypes{ diff --git a/src/bastlibridge/bot.d b/src/bastlibridge/bot.d @@ -93,7 +93,7 @@ struct IDCounter(T){ static this(){ globalCommands.add!((Message m, in char[] a, in char[] b){m.source.manager.link(a,b);})("link"); globalCommands.add!((Message m, in char[] a, in char[] b){m.source.manager.linkDirected(a,b);})("linkDirected"); - globalCommands.add!((Message m, in char[] b){m.source.manager.link(Port(m.source, m.source.getChannel(m.getChannelName)),b);})("linkWith"); + globalCommands.add!((Message m, in char[] b){m.source.manager.link(m.getPort(),b);})("linkWith"); globalCommands.add!((Message m){m.source.stop();})("quit"); globalCommands.add!((Message m){m.source.manager.teardown();})("teardown"); globalCommands.add!((Message m, in char[] other){m.respond(enforce(m.source.manager.getEndpoint(other),"Endpoint unknown").endpoint.lastSeen());})("lastUpdate"); diff --git a/src/bastlibridge/command.d b/src/bastlibridge/command.d @@ -23,7 +23,12 @@ struct CommandMachine{ } Function[string] commands; - auto execute(in char[] name, Message m, in char[] args){ + auto execute(in char[] name, Message m, in char[] args) + in{ + assert(name); + assert(m); + } + do{ auto cmd=enforce!CommandException(name in commands, format("Command %s unknown", name)); assert(cmd); if(cmd.need_auth && !m.auth()){ diff --git a/src/bastlibridge/interfaces/telegram.d b/src/bastlibridge/interfaces/telegram.d @@ -1,6 +1,7 @@ module bastlibridge.interfaces.telegram; static import tg=telegram.telegram; import bastlibridge.base; +import bastlibridge.command; import std.conv; import std.format; import core.sync.mutex; @@ -23,26 +24,34 @@ class Telegram: QueuedEndpoint{ listener_lock=new Mutex(); telegram_listener.onMessage~=(j){ - trace("Received Message "~j.toPrettyString()); + trace("Received Message\n"~j.toPrettyString()); auto jv="text" in j; + trace("We have some text"); string msg=""; if(jv){ msg=j["text"].str; } - + trace("got message ", msg); + auto chatid=j["chat"]["id"].integer; + trace("chatid is ", chatid); auto chan=chatid in telegram_channels; + trace("we got the channel ", chan); auto get_msg(){ - return new TelegramMessage(j); + auto m=new TelegramMessage(j); + m.source=this; + return m; } void forward_msg(){ if(!chan){ warning("Message to unknown chat ", chatid); } - manager.distribute(Port(this, *chan), get_msg()); + else{ + manager.distribute(Port(this, *chan), get_msg()); + } } - if(msg.front=='/'){ + if(msg.length>0 && msg.front=='/'){ trace("Bot command received"); try{ auto split=msg.findSplit(" "); @@ -52,7 +61,8 @@ class Telegram: QueuedEndpoint{ forward_msg(); } else{ - + auto s=msg.findSplit(" "); + globalCommands.execute(s[0][1..$], get_msg(), s[2]); } } catch(Exception e){ @@ -94,13 +104,16 @@ class Telegram: QueuedEndpoint{ import ssl.openssl; loadOpenSSL(); //We have to do this once for every thread while(!shutdown){ + trace("triggering updates"); synchronized(mtx) telegram_listener.triggerUpdates(); + trace("waiting for messages"); telegram_listener.wait(); synchronized(mtx){ telegram_listener.read(); sendQueue(); } + trace("msgloop done"); } } diff --git a/src/bastlibridge/manager.d b/src/bastlibridge/manager.d @@ -170,6 +170,8 @@ class Manager{ } } Port pa=gp(a),pb=gp(b); + assert(pa.valid()); + assert(pb.valid()); trace("Doing a %s on ", a, " and ", b); synchronized(LUT_lock.writer){ LUT.%s(pa,pb); diff --git a/src/telegram/telegram.d b/src/telegram/telegram.d @@ -257,7 +257,7 @@ struct Telegram{ return; } updateRunning=true; - trace("Triggering Update with timeout ", timeout); + trace("Triggering Update with timeout ", timeout, " lastupdate ",lastUpdate); string params=format!"offset=%d&timeout=%d"(lastUpdate+1,timeout); post("getUpdates",params); }