sig
  type action =
      Nothing
    | GetMe of (Api.User.user Api.Result.result -> Api.Command.action)
    | SendMessage of int * string
    | SendPhoto of int * string * string option * int option *
        (string Api.Result.result -> Api.Command.action)
    | ResendPhoto of int * string * string option * int option
    | SendAudio of int * string * string * string * int option *
        (string Api.Result.result -> Api.Command.action)
    | ResendAudio of int * string * string * string * int option
    | SendVoice of int * string * int option *
        (string Api.Result.result -> Api.Command.action)
    | ResendVoice of int * string * int option
    | GetUpdates of
        (Api.Update.update list Api.Result.result -> Api.Command.action)
    | PeekUpdate of
        (Api.Update.update Api.Result.result -> Api.Command.action)
    | PopUpdate of
        (Api.Update.update Api.Result.result -> Api.Command.action)
    | Chain of Api.Command.action * Api.Command.action
  type command = {
    name : string;
    description : string;
    mutable enabled : bool;
    run : Api.Message.message -> Api.Command.action;
  }
  val is_command : Api.Update.update -> bool
  val read_command :
    Api.Message.message -> Api.Command.command list -> Api.Command.action
  val read_update :
    Api.Update.update -> Api.Command.command list -> Api.Command.action
  val tokenize : string -> string list
end