{"accept_secret_chat",{ca_secret_chat,ca_none},do_accept_secret_chat,"accept_secret_chat <secret chat>\tAccepts secret chat. Only useful with -E option"},
structcommandcommands[MAX_COMMANDS_SIZE]={
{"add_contact",{ca_string,ca_string,ca_string,ca_none},do_add_contact,"add_contact <phone> <first name> <last name>\tTries to add user to contact list"},
{"accept_secret_chat",{ca_secret_chat,ca_none},do_accept_secret_chat,"accept_secret_chat <secret chat>\tAccepts secret chat. Only useful with -E option",NULL},
{"broadcast",{ca_user,ca_period,ca_string_end,ca_none},do_broadcast,"broadcast <user>+ <text>\tSends text to several users at once"},
{"add_contact",{ca_string,ca_string,ca_string,ca_none},do_add_contact,"add_contact <phone> <first name> <last name>\tTries to add user to contact list",NULL},
{"chat_add_user",{ca_chat,ca_user,ca_number|ca_optional,ca_none},do_chat_add_user,"chat_add_user <chat> <user> [msgs-to-forward]\tAdds user to chat. Sends him last msgs-to-forward message from this chat. Default 100"},
{"broadcast",{ca_user,ca_period,ca_string_end,ca_none},do_broadcast,"broadcast <user>+ <text>\tSends text to several users at once",NULL},
{"chat_del_user",{ca_chat,ca_user,ca_none},do_chat_del_user,"chat_del_user <chat> <user>\tDeletes user from chat"},
{"chat_add_user",{ca_chat,ca_user,ca_number|ca_optional,ca_none},do_chat_add_user,"chat_add_user <chat> <user> [msgs-to-forward]\tAdds user to chat. Sends him last msgs-to-forward message from this chat. Default 100",NULL},
{"chat_info",{ca_chat,ca_none},do_chat_info,"chat_info <chat>\tPrints info about chat (id, members, admin, etc.)"},
{"chat_del_user",{ca_chat,ca_user,ca_none},do_chat_del_user,"chat_del_user <chat> <user>\tDeletes user from chat",NULL},
{"chat_set_photo",{ca_chat,ca_file_name_end,ca_none},do_chat_set_photo,"chat_set_photo <chat> <filename>\tSets chat photo. Photo will be cropped to square"},
{"chat_info",{ca_chat,ca_none},do_chat_info,"chat_info <chat>\tPrints info about chat (id, members, admin, etc.)",NULL},
{"chat_with_peer",{ca_peer,ca_none},do_chat_with_peer,"chat_with_peer <peer>\tInterface option. All input will be treated as messages to this peer. Type /quit to end this mode"},
{"chat_set_photo",{ca_chat,ca_file_name_end,ca_none},do_chat_set_photo,"chat_set_photo <chat> <filename>\tSets chat photo. Photo will be cropped to square",NULL},
{"clear",{ca_none},do_clear,"clear\tClears all data and exits. For debug."},
{"chat_with_peer",{ca_peer,ca_none},do_chat_with_peer,"chat_with_peer <peer>\tInterface option. All input will be treated as messages to this peer. Type /quit to end this mode",NULL},
{"create_group_chat",{ca_string,ca_user,ca_period,ca_none},do_create_group_chat,"create_group_chat <name> <user>+\tCreates group chat with users"},
{"contact_search",{ca_string,ca_number|ca_optional,ca_none},do_contact_search,"contact_search username [limit]\tSearches contacts by username",NULL},
{"create_secret_chat",{ca_user,ca_none},do_create_secret_chat,"create_secret_chat <user>\tStarts creation of secret chat"},
{"create_group_chat",{ca_string,ca_user,ca_period,ca_none},do_create_group_chat,"create_group_chat <name> <user>+\tCreates group chat with users",NULL},
{"del_contact",{ca_user,ca_none},do_del_contact,"del_contact <user>\tDeletes contact from contact list"},
{"create_secret_chat",{ca_user,ca_none},do_create_secret_chat,"create_secret_chat <user>\tStarts creation of secret chat",NULL},
{"export_card",{ca_none},do_export_card,"export_card\tPrints card that can be imported by another user with import_card method"},
{"dialog_list",{ca_number|ca_optional,ca_number|ca_optional,ca_none},do_dialog_list,"dialog_list [limit=100] [offset=0]\tList of last conversations",NULL},
{"export_chat_link",{ca_chat,ca_none},do_export_chat_link,"export_chat_link\tPrints chat link that can be used to join to chat"},
{"export_card",{ca_none},do_export_card,"export_card\tPrints card that can be imported by another user with import_card method",NULL},
{"fwd",{ca_peer,ca_number,ca_period,ca_none},do_fwd,"fwd <peer> <msg-id>+\tForwards message to peer. Forward to secret chats is forbidden"},
{"export_chat_link",{ca_chat,ca_none},do_export_chat_link,"export_chat_link\tPrints chat link that can be used to join to chat",NULL},
{"fwd_media",{ca_peer,ca_number,ca_none},do_fwd_media,"fwd <peer> <msg-id>\tForwards message media to peer. Forward to secret chats is forbidden. Result slightly differs from fwd"},
{"fwd",{ca_peer,ca_number,ca_period,ca_none},do_fwd,"fwd <peer> <msg-id>+\tForwards message to peer. Forward to secret chats is forbidden",NULL},
{"get_message",{ca_number,ca_none},do_get_message,"get_message <msg-id>\tGet message by id"},
{"fwd_media",{ca_peer,ca_number,ca_none},do_fwd_media,"fwd <peer> <msg-id>\tForwards message media to peer. Forward to secret chats is forbidden. Result slightly differs from fwd",NULL},
{"help",{ca_none},do_help,"help\tPrints this help"},
{"get_message",{ca_number,ca_none},do_get_message,"get_message <msg-id>\tGet message by id",NULL},
{"history",{ca_peer,ca_number|ca_optional,ca_number|ca_optional,ca_none},do_history,"history <peer> [limit] [offset]\tPrints messages with this peer (most recent message lower). Also marks messages as read"},
{"help",{ca_none},do_help,"help\tPrints this help",NULL},
{"import_card",{ca_string,ca_none},do_import_card,"import_card <card>\tGets user by card and prints it name. You can then send messages to him as usual"},
{"history",{ca_peer,ca_number|ca_optional,ca_number|ca_optional,ca_none},do_history,"history <peer> [limit] [offset]\tPrints messages with this peer (most recent message lower). Also marks messages as read",NULL},
{"import_chat_link",{ca_string,ca_none},do_import_chat_link,"impoty_chat_link <hash>\tJoins to chat by link"},
{"import_card",{ca_string,ca_none},do_import_card,"import_card <card>\tGets user by card and prints it name. You can then send messages to him as usual",NULL},
{"load_audio",{ca_number,ca_none},do_load_audio,"load_audio <msg-id>\tDownloads file to downloads dirs. Prints file name after download end"},
{"import_chat_link",{ca_string,ca_none},do_import_chat_link,"impoty_chat_link <hash>\tJoins to chat by link",NULL},
{"load_chat_photo",{ca_chat,ca_none},do_load_user_photo,"load_chat_photo <chat>\tDownloads file to downloads dirs. Prints file name after download end"},
{"load_audio",{ca_number,ca_none},do_load_audio,"load_audio <msg-id>\tDownloads file to downloads dirs. Prints file name after download end",NULL},
{"load_document",{ca_number,ca_none},do_load_document,"load_document <msg-id>\tDownloads file to downloads dirs. Prints file name after download end"},
{"load_chat_photo",{ca_chat,ca_none},do_load_user_photo,"load_chat_photo <chat>\tDownloads file to downloads dirs. Prints file name after download end",NULL},
{"load_document_thumb",{ca_number,ca_none},do_load_document_thumb,"load_document_thumb <msg-id>\tDownloads file to downloads dirs. Prints file name after download end"},
{"load_document",{ca_number,ca_none},do_load_document,"load_document <msg-id>\tDownloads file to downloads dirs. Prints file name after download end",NULL},
{"load_file",{ca_number,ca_none},do_load_file,"load_file <msg-id>\tDownloads file to downloads dirs. Prints file name after download end"},
{"load_document_thumb",{ca_number,ca_none},do_load_document_thumb,"load_document_thumb <msg-id>\tDownloads file to downloads dirs. Prints file name after download end",NULL},
{"load_file_thumb",{ca_number,ca_none},do_load_file_thumb,"load_file_thumb <msg-id>\tDownloads file to downloads dirs. Prints file name after download end"},
{"load_file",{ca_number,ca_none},do_load_file,"load_file <msg-id>\tDownloads file to downloads dirs. Prints file name after download end",NULL},
{"load_photo",{ca_number,ca_none},do_load_photo,"load_photo <msg-id>\tDownloads file to downloads dirs. Prints file name after download end"},
{"load_file_thumb",{ca_number,ca_none},do_load_file_thumb,"load_file_thumb <msg-id>\tDownloads file to downloads dirs. Prints file name after download end",NULL},
{"load_user_photo",{ca_user,ca_none},do_load_user_photo,"load_user_photo <user>\tDownloads file to downloads dirs. Prints file name after download end"},
{"load_photo",{ca_number,ca_none},do_load_photo,"load_photo <msg-id>\tDownloads file to downloads dirs. Prints file name after download end",NULL},
{"load_video",{ca_number,ca_none},do_load_video,"load_video <msg-id>\tDownloads file to downloads dirs. Prints file name after download end"},
{"load_user_photo",{ca_user,ca_none},do_load_user_photo,"load_user_photo <user>\tDownloads file to downloads dirs. Prints file name after download end",NULL},
{"load_video_thumb",{ca_number,ca_none},do_load_video_thumb,"load_video_thumb <msg-id>\tDownloads file to downloads dirs. Prints file name after download end"},
{"load_video",{ca_number,ca_none},do_load_video,"load_video <msg-id>\tDownloads file to downloads dirs. Prints file name after download end",NULL},
{"main_session",{ca_none},do_main_session,"main_session\tSends updates to this connection (or terminal). Useful only with listening socket"},
{"load_video_thumb",{ca_number,ca_none},do_load_video_thumb,"load_video_thumb <msg-id>\tDownloads file to downloads dirs. Prints file name after download end",NULL},
{"mark_read",{ca_peer,ca_none},do_mark_read,"mark_read <peer>\tMarks messages with peer as read"},
{"main_session",{ca_none},do_main_session,"main_session\tSends updates to this connection (or terminal). Useful only with listening socket",NULL},
{"msg",{ca_peer,ca_string_end,ca_none},do_msg,"msg <peer> <text>\tSends text message to peer"},
{"mark_read",{ca_peer,ca_none},do_mark_read,"mark_read <peer>\tMarks messages with peer as read",NULL},
//{"reply_text", {ca_number, ca_file_name_end, ca_none}, do_reply_text, "reply_text <msg-id> <file>\tSends contents of text file as plain text message"},
{"reply_photo",{ca_number,ca_file_name,ca_string_end|ca_optional,ca_none},do_reply_photo,"reply_photo <msg-id> <file> [caption]\tSends photo to peer",NULL},
{"reply_video",{ca_number,ca_file_name,ca_none},do_reply_video,"reply_video <msg-id> <file>\tSends video to peer"},
//{"reply_text", {ca_number, ca_file_name_end, ca_none}, do_reply_text, "reply_text <msg-id> <file>\tSends contents of text file as plain text message", NULL},
// {"restore_msg", {ca_number, ca_none}, do_restore_msg, "restore_msg <msg-id>\tRestores message. Only available shortly (one hour?) after deletion"},
{"reply_video",{ca_number,ca_file_name,ca_none},do_reply_video,"reply_video <msg-id> <file>\tSends video to peer",NULL},
{"safe_quit",{ca_none},do_safe_quit,"safe_quit\tWaits for all queries to end, then quits"},
// {"restore_msg", {ca_number, ca_none}, do_restore_msg, "restore_msg <msg-id>\tRestores message. Only available shortly (one hour?) after deletion", NULL},
{"search",{ca_peer|ca_optional,ca_number|ca_optional,ca_number|ca_optional,ca_number|ca_optional,ca_number|ca_optional,ca_string_end},do_search,"search [peer] [limit] [from] [to] [offset] pattern\tSearch for pattern in messages from date from to date to (unixtime) in messages with peer (if peer not present, in all messages)"},
{"safe_quit",{ca_none},do_safe_quit,"safe_quit\tWaits for all queries to end, then quits",NULL},
{"secret_chat_rekey",{ca_secret_chat,ca_none},do_secret_chat_rekey,"generate new key for active secret chat"},
{"search",{ca_peer|ca_optional,ca_number|ca_optional,ca_number|ca_optional,ca_number|ca_optional,ca_number|ca_optional,ca_string_end},do_search,"search [peer] [limit] [from] [to] [offset] pattern\tSearch for pattern in messages from date from to date to (unixtime) in messages with peer (if peer not present, in all messages)",NULL},
{"send_audio",{ca_peer,ca_file_name,ca_none},do_send_audio,"send_audio <peer> <file>\tSends audio to peer"},
{"secret_chat_rekey",{ca_secret_chat,ca_none},do_secret_chat_rekey,"generate new key for active secret chat",NULL},
{"set",{ca_string,ca_number,ca_none},do_set,"set <param> <value>\tSets value of param. Currently available: log_level, debug_verbosity, alarm, msg_num"},
{"send_video",{ca_peer,ca_file_name,ca_string|ca_optional,ca_none},do_send_video,"send_video <peer> <file> [caption]\tSends video to peer",NULL},
{"set",{ca_string,ca_number,ca_none},do_set,"set <param> <value>\tSets value of param. Currently available: log_level, debug_verbosity, alarm, msg_num",NULL},
{"set_profile_photo",{ca_file_name_end,ca_none},do_set_profile_photo,"set_profile_photo <filename>\tSets profile photo. Photo will be cropped to square"},
{"set_profile_photo",{ca_file_name_end,ca_none},do_set_profile_photo,"set_profile_photo <filename>\tSets profile photo. Photo will be cropped to square",NULL},
{"status_offline",{ca_none},do_status_offline,"status_offline\tSets status as offline"},
{"status_online",{ca_none},do_status_online,"status_online\tSets status as online",NULL},
{"user_info",{ca_user,ca_none},do_user_info,"user_info <user>\tPrints info about user (id, last online, phone)"},
{"status_offline",{ca_none},do_status_offline,"status_offline\tSets status as offline",NULL},
{"view_audio",{ca_number,ca_none},do_open_audio,"view_audio <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action"},
{"user_info",{ca_user,ca_none},do_user_info,"user_info <user>\tPrints info about user (id, last online, phone)",NULL},
{"view_chat_photo",{ca_chat,ca_none},do_view_user_photo,"view_chat_photo <chat>\tDownloads file to downloads dirs. Then tries to open it with system default action"},
{"view_audio",{ca_number,ca_none},do_open_audio,"view_audio <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action",NULL},
{"view_document",{ca_number,ca_none},do_open_document,"view_document <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action"},
{"view_chat_photo",{ca_chat,ca_none},do_view_user_photo,"view_chat_photo <chat>\tDownloads file to downloads dirs. Then tries to open it with system default action",NULL},
{"view_document_thumb",{ca_number,ca_none},do_open_document_thumb,"view_document_thumb <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action"},
{"view_document",{ca_number,ca_none},do_open_document,"view_document <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action",NULL},
{"view_file",{ca_number,ca_none},do_open_file,"view_file <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action"},
{"view_document_thumb",{ca_number,ca_none},do_open_document_thumb,"view_document_thumb <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action",NULL},
{"view_file_thumb",{ca_number,ca_none},do_open_file_thumb,"view_file_thumb <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action"},
{"view_file",{ca_number,ca_none},do_open_file,"view_file <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action",NULL},
{"view_photo",{ca_number,ca_none},do_open_photo,"view_photo <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action"},
{"view_file_thumb",{ca_number,ca_none},do_open_file_thumb,"view_file_thumb <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action",NULL},
{"view_user_photo",{ca_user,ca_none},do_view_user_photo,"view_user_photo <user>\tDownloads file to downloads dirs. Then tries to open it with system default action"},
{"view_photo",{ca_number,ca_none},do_open_photo,"view_photo <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action",NULL},
{"view_video",{ca_number,ca_none},do_open_video,"view_video <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action"},
{"view_user_photo",{ca_user,ca_none},do_view_user_photo,"view_user_photo <user>\tDownloads file to downloads dirs. Then tries to open it with system default action",NULL},
{"view_video_thumb",{ca_number,ca_none},do_open_video_thumb,"view_video_thumb <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action"},
{"view_video",{ca_number,ca_none},do_open_video,"view_video <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action",NULL},
{"view",{ca_number,ca_none},do_open_any,"view <msg-id>\tTries to view message contents"},
{"view_video_thumb",{ca_number,ca_none},do_open_video_thumb,"view_video_thumb <msg-id>\tDownloads file to downloads dirs. Then tries to open it with system default action",NULL},
{"visualize_key",{ca_secret_chat,ca_none},do_visualize_key,"visualize_key <secret chat>\tPrints visualization of encryption key (first 16 bytes sha1 of it in fact}"},
{"view",{ca_number,ca_none},do_open_any,"view <msg-id>\tTries to view message contents",NULL},
{0,{ca_none},0,""}
{"visualize_key",{ca_secret_chat,ca_none},do_visualize_key,"visualize_key <secret chat>\tPrints visualization of encryption key (first 16 bytes sha1 of it in fact}",NULL}