2 files changed, 125 insertions(+), 0 deletions(-)

A => .hgignore
A => telegram-bot-diagram.dot
A => .hgignore +2 -0
@@ 0,0 1,2 @@ 
+syntax: glob
+*.png

          
A => telegram-bot-diagram.dot +123 -0
@@ 0,0 1,123 @@ 
+digraph G {
+    subgraph bot_states {
+        node [shape=ellipse];
+        "bot waiting";
+        "bot got inline query";
+        "bot got /<command>";
+        "if /setinlinefeedback,\nbot saw reply";
+        "bot got callback";
+    }
+    subgraph user_states {
+        node [shape=ellipse];
+        "user typed @bot,\nsaw placeholder text";
+        "user got reply\n+ ReplyKeyboard";
+        "group got picked reply";
+
+        "user got callback/URL/'go to inline' buttons" [ordering=out];
+        "user opened external link";
+        "group got reply";
+    }
+    subgraph transitions {
+        node [shape=rect];
+        // user to bot
+        "user sends /<command>";
+        "user replies to bot message";
+        "x is added/removed\nfrom group";
+        "user types @bot";
+        "user sends bot inline query";
+        "user types any message in group\n(non-private mode)";
+        "user picks reply";
+        "user taps callback button";
+        "user taps URL button";
+        "user taps 'go to inline' button";
+        "user taps a '/<command>' in message";
+
+        // bot to user
+        "bot replies\n+ InlineReplyKeyboard";
+        "bot replies\n+ ReplyKeyboard";
+        "bot replies"
+        "bot updates reply in-place";
+    }
+    "bot waiting"
+    -> "user types @bot";
+       "user types @bot"
+       -> "user typed @bot,\nsaw placeholder text";
+    "user typed @bot,\nsaw placeholder text"
+    -> "user sends bot inline query";
+       "user sends bot inline query"
+       -> "bot got inline query";
+
+    "bot got inline query"
+    -> "bot replies";
+
+    "bot got inline query"
+    -> "bot replies\n+ ReplyKeyboard";
+       "bot replies\n+ ReplyKeyboard"
+       -> "user got reply\n+ ReplyKeyboard";
+
+    "user got reply\n+ ReplyKeyboard"
+    -> "user picks reply";
+       "user picks reply"
+       -> "group got picked reply";
+       "user picks reply"
+       -> "if /setinlinefeedback,\nbot saw reply";
+
+    "bot got inline query"
+    -> "bot replies\n+ InlineReplyKeyboard";
+       "bot replies\n+ InlineReplyKeyboard"
+       -> "user got callback/URL/'go to inline' buttons";
+
+    "user got callback/URL/'go to inline' buttons"
+    -> "user taps callback button";
+       "user taps callback button"
+       -> "bot got callback";
+    "bot got callback"
+    -> "bot updates reply in-place";
+       "bot updates reply in-place"
+       -> "user got callback/URL/'go to inline' buttons";
+
+    "user got callback/URL/'go to inline' buttons"
+    -> "user taps URL button";
+       "user taps URL button"
+       -> "user opened external link";
+
+    "user got callback/URL/'go to inline' buttons"
+    -> "user taps 'go to inline' button";
+       // tell Graphviz that "user typed @bot" remains early in the hierarchy,
+       // and "user taps ..." remains late,
+       // but the arrow should start at "user taps".
+       "user typed @bot,\nsaw placeholder text"
+       -> "user taps 'go to inline' button" [dir=back];
+
+    "bot waiting"
+    -> "user sends /<command>";
+       "user sends /<command>"
+       -> "bot got /<command>";
+
+    "bot got /<command>" -> "bot replies\n+ InlineReplyKeyboard";
+    "bot got /<command>" -> "bot replies\n+ ReplyKeyboard";
+    "bot got /<command>" -> "bot replies";
+
+    "bot replies"
+    -> "group got reply";
+       "group got reply"
+       -> "user taps a '/<command>' in message";
+
+    "bot got /<command>"
+    -> "user taps a '/<command>' in message" [dir=back];
+
+    "bot waiting"
+    -> "user replies to bot message";
+       "user replies to bot message"
+       -> "TODO";
+
+    "bot waiting"
+    -> "x is added/removed\nfrom group";
+       "x is added/removed\nfrom group"
+       -> "TODO";
+
+    "bot waiting"
+    -> "user types any message in group\n(non-private mode)";
+       "user types any message in group\n(non-private mode)"
+       -> "TODO";
+}