@@ 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";
+}