commit 53716243fbcf322b2e0d5551436d6ddc0960e115
parent ce38c2cefad48b5f528eca41f23cbf6ae5cf3cc7
Author: Dominik Schmidt <das1993@hotmail.com>
Date: Wed, 5 Sep 2018 09:44:52 +0000
Smaller corrections and improvements
Diffstat:
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);
}