This commit is contained in:
V V 2015-09-30 19:49:50 +03:00
parent 8fe867943d
commit d15b20d48c
4 changed files with 242 additions and 100 deletions

View File

@ -104,6 +104,7 @@ extern int one_string_flags;
extern int enable_json; extern int enable_json;
int disable_auto_accept; int disable_auto_accept;
int msg_num_mode; int msg_num_mode;
int permanent_id_mode;
int disable_colors; int disable_colors;
int alert_sound; int alert_sound;
extern int binlog_read; extern int binlog_read;
@ -330,7 +331,7 @@ void next_token_end_ac (void) {
} }
#define NOT_FOUND (int)0x80000000 #define NOT_FOUND (int)0x80000000
tgl_peer_id_t TGL_PEER_NOT_FOUND = {.id = NOT_FOUND}; tgl_peer_id_t TGL_PEER_NOT_FOUND = {.peer_id = NOT_FOUND};
long long cur_token_int (void) { long long cur_token_int (void) {
if (cur_token_len <= 0) { if (cur_token_len <= 0) {
@ -349,6 +350,56 @@ long long cur_token_int (void) {
} }
} }
int hex2int (char c) {
if (c >= '0' && c <= '9') { return c - '0'; }
if (c >= 'a' && c <= 'f') { return c - 'a' + 10; }
assert (0);
return 0;
}
tgl_message_id_t cur_token_msg_id (void) {
if (cur_token_len <= 0) {
tgl_message_id_t id;
memset (&id, 0, sizeof (id));
id.peer_type = 0;
return id;
} else {
tgl_message_id_t id;
memset (&id, 0, sizeof (id));
if (cur_token_len == 2 * sizeof (tgl_message_id_t)) {
int i;
for (i = 0; i < (int)sizeof (tgl_message_id_t); i++) {
if (
(cur_token[i] < '0' || cur_token[i] > '9') &&
(cur_token[i] < 'a' || cur_token[i] > 'f')
) {
id.peer_type = 0;
return id;
}
}
unsigned char *d = (void *)&id;
for (i = 0; i < (int)sizeof (tgl_message_id_t); i++) {
d[i] = hex2int (cur_token[2 * i]) * 16 + hex2int (cur_token[2 * i + 1]);
}
return id;
} else {
char c = cur_token[cur_token_len];
cur_token[cur_token_len] = 0;
char *end = 0;
long long x = strtoll (cur_token, &end, 0);
cur_token[cur_token_len] = c;
if (end != cur_token + cur_token_len) {
id.peer_type = 0;
} else {
id.peer_type = TGL_PEER_TEMP_ID;
id.id = x;
}
return id;
}
}
}
double cur_token_double (void) { double cur_token_double (void) {
if (cur_token_len <= 0) { if (cur_token_len <= 0) {
return NOT_FOUND; return NOT_FOUND;
@ -607,6 +658,7 @@ enum command_argument {
ca_modifier, ca_modifier,
ca_command, ca_command,
ca_extf, ca_extf,
ca_msg_id,
ca_optional = 256 ca_optional = 256
@ -620,6 +672,7 @@ struct arg {
char *str; char *str;
long long num; long long num;
double dval; double dval;
tgl_message_id_t msg_id;
}; };
}; };
@ -640,7 +693,7 @@ void print_user_list_gw (struct tgl_state *TLS, void *extra, int success, int nu
void print_msg_list_gw (struct tgl_state *TLS, void *extra, int success, int num, struct tgl_message *ML[]); void print_msg_list_gw (struct tgl_state *TLS, void *extra, int success, int num, struct tgl_message *ML[]);
void print_msg_list_history_gw (struct tgl_state *TLS, void *extra, int success, int num, struct tgl_message *ML[]); void print_msg_list_history_gw (struct tgl_state *TLS, void *extra, int success, int num, struct tgl_message *ML[]);
void print_msg_list_success_gw (struct tgl_state *TLS, void *extra, int success, int num, struct tgl_message *ML[]); void print_msg_list_success_gw (struct tgl_state *TLS, void *extra, int success, int num, struct tgl_message *ML[]);
void print_dialog_list_gw (struct tgl_state *TLS, void *extra, int success, int size, tgl_peer_id_t peers[], int last_msg_id[], int unread_count[]); void print_dialog_list_gw (struct tgl_state *TLS, void *extra, int success, int size, tgl_peer_id_t peers[], tgl_message_id_t *last_msg_id[], int unread_count[]);
void print_chat_info_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_chat *C); void print_chat_info_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_chat *C);
void print_user_info_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_user *C); void print_user_info_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_user *C);
void print_filename_gw (struct tgl_state *TLS, void *extra, int success, const char *name); void print_filename_gw (struct tgl_state *TLS, void *extra, int success, const char *name);
@ -649,6 +702,7 @@ void open_filename_gw (struct tgl_state *TLS, void *extra, int success, const ch
void print_secret_chat_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_secret_chat *E); void print_secret_chat_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_secret_chat *E);
void print_card_gw (struct tgl_state *TLS, void *extra, int success, int size, int *card); void print_card_gw (struct tgl_state *TLS, void *extra, int success, int size, int *card);
void print_user_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_user *U); void print_user_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_user *U);
void print_peer_gw (struct tgl_state *TLS, void *extra, int success, tgl_peer_t *U);
void print_msg_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_message *M); void print_msg_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_message *M);
void print_msg_success_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_message *M); void print_msg_success_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_message *M);
void print_encr_chat_success_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_secret_chat *E);; void print_encr_chat_success_gw (struct tgl_state *TLS, void *extra, int success, struct tgl_secret_chat *E);;
@ -789,7 +843,7 @@ void do_msg_kbd (struct command *command, int arg_num, struct arg args[], struct
void do_reply (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_reply (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
assert (arg_num == 2); assert (arg_num == 2);
if (ev) { ev->refcnt ++; } if (ev) { ev->refcnt ++; }
tgl_do_reply_message (TLS, args[0].num, ARG2STR(1), disable_msg_preview, print_msg_success_gw, ev); tgl_do_reply_message (TLS, &args[0].msg_id, ARG2STR(1), disable_msg_preview, print_msg_success_gw, ev);
} }
void do_send_text (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_send_text (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
@ -806,7 +860,7 @@ void do_post_text (struct command *command, int arg_num, struct arg args[], stru
void do_reply_text (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_reply_text (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
assert (arg_num == 2); assert (arg_num == 2);
if (ev) { ev->refcnt ++; } if (ev) { ev->refcnt ++; }
tgl_do_reply_text (TLS, args[0].num, args[1].str, disable_msg_preview, print_msg_success_gw, ev); tgl_do_reply_text (TLS, &args[0].msg_id, args[1].str, disable_msg_preview, print_msg_success_gw, ev);
} }
static void _do_send_file (struct command *command, int arg_num, struct arg args[], struct in_ev *ev, unsigned long long flags) { static void _do_send_file (struct command *command, int arg_num, struct arg args[], struct in_ev *ev, unsigned long long flags) {
@ -859,7 +913,7 @@ void do_post_document (struct command *command, int arg_num, struct arg args[],
void _do_reply_file (struct command *command, int arg_num, struct arg args[], struct in_ev *ev, unsigned long long flags) { void _do_reply_file (struct command *command, int arg_num, struct arg args[], struct in_ev *ev, unsigned long long flags) {
assert (arg_num >= 2); assert (arg_num >= 2);
if (ev) { ev->refcnt ++; } if (ev) { ev->refcnt ++; }
tgl_do_reply_document (TLS, args[0].num, args[1].str, arg_num == 2 ? NULL : args[2].str, arg_num == 2 ? 0 : strlen (args[2].str), flags, print_msg_success_gw, ev); tgl_do_reply_document (TLS, &args[0].msg_id, args[1].str, arg_num == 2 ? NULL : args[2].str, arg_num == 2 ? 0 : strlen (args[2].str), flags, print_msg_success_gw, ev);
} }
void do_reply_photo (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_reply_photo (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
@ -886,22 +940,22 @@ void do_fwd (struct command *command, int arg_num, struct arg args[], struct in_
assert (arg_num >= 2); assert (arg_num >= 2);
if (ev) { ev->refcnt ++; } if (ev) { ev->refcnt ++; }
assert (arg_num <= 1000); assert (arg_num <= 1000);
if (arg_num == 2) { //if (arg_num == 2) {
tgl_do_forward_message (TLS, args[0].P->id, args[1].num, 0, print_msg_success_gw, ev); // tgl_do_forward_message (TLS, args[0].P->id, &args[1].msg_id, 0, print_msg_success_gw, ev);
} else { //} else {
static int list[1000]; static tgl_message_id_t *list[1000];
int i; int i;
for (i = 0; i < arg_num - 1; i++) { for (i = 0; i < arg_num - 1; i++) {
list[i] = args[i + 1].num; list[i] = &args[i + 1].msg_id;
}
tgl_do_forward_messages (TLS, args[0].P->id, arg_num - 1, list, 0, print_msg_list_success_gw, ev);
} }
tgl_do_forward_messages (TLS, args[0].P->id, arg_num - 1, (void *)list, 0, print_msg_list_success_gw, ev);
//}
} }
void do_fwd_media (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_fwd_media (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
assert (arg_num == 2); assert (arg_num == 2);
if (ev) { ev->refcnt ++; } if (ev) { ev->refcnt ++; }
tgl_do_forward_media (TLS, args[0].P->id, args[1].num, 0, print_msg_success_gw, ev); tgl_do_forward_media (TLS, args[0].P->id, &args[1].msg_id, 0, print_msg_success_gw, ev);
} }
void do_send_contact (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_send_contact (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
@ -913,7 +967,7 @@ void do_send_contact (struct command *command, int arg_num, struct arg args[], s
void do_reply_contact (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_reply_contact (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
assert (arg_num == 4); assert (arg_num == 4);
if (ev) { ev->refcnt ++; } if (ev) { ev->refcnt ++; }
tgl_do_reply_contact (TLS, args[0].num, ARG2STR (1), ARG2STR (2), ARG2STR (3), 0, print_msg_success_gw, ev); tgl_do_reply_contact (TLS, &args[0].msg_id, ARG2STR (1), ARG2STR (2), ARG2STR (3), 0, print_msg_success_gw, ev);
} }
void do_send_location (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_send_location (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
@ -931,7 +985,7 @@ void do_post_location (struct command *command, int arg_num, struct arg args[],
void do_reply_location (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_reply_location (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
assert (arg_num == 3); assert (arg_num == 3);
if (ev) { ev->refcnt ++; } if (ev) { ev->refcnt ++; }
tgl_do_reply_location (TLS, args[0].num, args[1].dval, args[2].dval, 0, print_msg_success_gw, ev); tgl_do_reply_location (TLS, &args[0].msg_id, args[1].dval, args[2].dval, 0, print_msg_success_gw, ev);
} }
void do_broadcast (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_broadcast (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
@ -951,7 +1005,7 @@ void do_broadcast (struct command *command, int arg_num, struct arg args[], stru
void do_get_self(struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_get_self(struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
if (ev) { ev->refcnt ++; } if (ev) { ev->refcnt ++; }
tgl_do_get_user_info (TLS, TGL_MK_USER(TLS->our_id), 0, print_user_info_gw, ev); tgl_do_get_user_info (TLS, TLS->our_id, 0, print_user_info_gw, ev);
} }
void do_set_profile_photo (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_set_profile_photo (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
@ -1221,7 +1275,7 @@ void do_channel_list (struct command *command, int arg_num, struct arg args[], s
void do_resolve_username (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_resolve_username (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
assert (arg_num == 1); assert (arg_num == 1);
if (ev) { ev->refcnt ++; } if (ev) { ev->refcnt ++; }
tgl_do_contact_search (TLS, args[0].str, strlen (args[0].str), print_user_gw, ev); tgl_do_contact_search (TLS, args[0].str, strlen (args[0].str), print_peer_gw, ev);
} }
void do_contact_list (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_contact_list (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
@ -1275,7 +1329,7 @@ void do_send_typing_abort (struct command *command, int arg_num, struct arg args
#define DO_LOAD_PHOTO(tp,act,actf) \ #define DO_LOAD_PHOTO(tp,act,actf) \
void do_ ## act ## _ ## tp (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { \ void do_ ## act ## _ ## tp (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { \
assert (arg_num == 1);\ assert (arg_num == 1);\
struct tgl_message *M = tgl_message_get (TLS, args[0].num);\ struct tgl_message *M = tgl_message_get (TLS, &args[0].msg_id);\
if (M && !(M->flags & TGLMF_SERVICE)) {\ if (M && !(M->flags & TGLMF_SERVICE)) {\
if (ev) { ev->refcnt ++; } \ if (ev) { ev->refcnt ++; } \
if (M->media.type == tgl_message_media_photo) { \ if (M->media.type == tgl_message_media_photo) { \
@ -1297,7 +1351,7 @@ void do_ ## act ## _ ## tp (struct command *command, int arg_num, struct arg arg
#define DO_LOAD_PHOTO_THUMB(tp,act,actf) \ #define DO_LOAD_PHOTO_THUMB(tp,act,actf) \
void do_ ## act ## _ ## tp ## _thumb (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { \ void do_ ## act ## _ ## tp ## _thumb (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { \
assert (arg_num == 1);\ assert (arg_num == 1);\
struct tgl_message *M = tgl_message_get (TLS, args[0].num);\ struct tgl_message *M = tgl_message_get (TLS, &args[0].msg_id);\
if (M && !(M->flags & TGLMF_SERVICE)) {\ if (M && !(M->flags & TGLMF_SERVICE)) {\
if (M->media.type == tgl_message_media_document) {\ if (M->media.type == tgl_message_media_document) {\
if (ev) { ev->refcnt ++; } \ if (ev) { ev->refcnt ++; } \
@ -1378,13 +1432,13 @@ void do_search (struct command *command, int arg_num, struct arg args[], struct
void do_delete_msg (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_delete_msg (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
if (ev) { ev->refcnt ++; } if (ev) { ev->refcnt ++; }
tgl_do_delete_msg (TLS, args[0].num, print_success_gw, ev); tgl_do_delete_msg (TLS, &args[0].msg_id, print_success_gw, ev);
} }
void do_get_message (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) { void do_get_message (struct command *command, int arg_num, struct arg args[], struct in_ev *ev) {
assert (arg_num == 1); assert (arg_num == 1);
if (ev) { ev->refcnt ++; } if (ev) { ev->refcnt ++; }
tgl_do_get_message (TLS, args[0].num, print_msg_gw, ev); tgl_do_get_message (TLS, &args[0].msg_id, print_msg_gw, ev);
} }
/* }}} */ /* }}} */
@ -1451,28 +1505,28 @@ struct command commands[MAX_COMMANDS_SIZE] = {
{"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}, {"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},
{"create_secret_chat", {ca_user, ca_none}, do_create_secret_chat, "create_secret_chat <user>\tStarts creation of secret chat", NULL}, {"create_secret_chat", {ca_user, ca_none}, do_create_secret_chat, "create_secret_chat <user>\tStarts creation of secret chat", NULL},
{"del_contact", {ca_user, ca_none}, do_del_contact, "del_contact <user>\tDeletes contact from contact list", NULL}, {"del_contact", {ca_user, ca_none}, do_del_contact, "del_contact <user>\tDeletes contact from contact list", NULL},
{"delete_msg", {ca_number, ca_none}, do_delete_msg, "delete_msg <msg-id>\tDeletes message", NULL}, {"delete_msg", {ca_msg_id, ca_none}, do_delete_msg, "delete_msg <msg-id>\tDeletes message", NULL},
{"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}, {"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_card", {ca_none}, do_export_card, "export_card\tPrints card that can be imported by another user with import_card method", NULL}, {"export_card", {ca_none}, do_export_card, "export_card\tPrints card that can be imported by another user with import_card method", 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", 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", 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", NULL}, {"fwd", {ca_peer, ca_msg_id, ca_period, ca_none}, do_fwd, "fwd <peer> <msg-id>+\tForwards message to peer. Forward to secret chats is forbidden", NULL},
{"fwd_media", {ca_peer, ca_number, ca_none}, do_fwd_media, "fwd_media <peer> <msg-id>\tForwards message media to peer. Forward to secret chats is forbidden. Result slightly differs from fwd", NULL}, {"fwd_media", {ca_peer, ca_msg_id, ca_none}, do_fwd_media, "fwd_media <peer> <msg-id>\tForwards message media to peer. Forward to secret chats is forbidden. Result slightly differs from fwd", NULL},
{"get_message", {ca_number, ca_none}, do_get_message, "get_message <msg-id>\tGet message by id", NULL}, {"get_message", {ca_msg_id, ca_none}, do_get_message, "get_message <msg-id>\tGet message by id", NULL},
{"get_self", {ca_none}, do_get_self, "get_self \tGet our user info", NULL}, {"get_self", {ca_none}, do_get_self, "get_self \tGet our user info", NULL},
{"help", {ca_none}, do_help, "help\tPrints this help", NULL}, {"help", {ca_none}, do_help, "help\tPrints this help", 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", 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", 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", 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", NULL},
{"import_chat_link", {ca_string, ca_none}, do_import_chat_link, "import_chat_link <hash>\tJoins to chat by link", NULL}, {"import_chat_link", {ca_string, ca_none}, do_import_chat_link, "import_chat_link <hash>\tJoins to chat by link", 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", NULL}, {"load_audio", {ca_msg_id, ca_none}, do_load_audio, "load_audio <msg-id>\tDownloads file to downloads dirs. Prints file name after download end", 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", 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", 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", NULL}, {"load_document", {ca_msg_id, ca_none}, do_load_document, "load_document <msg-id>\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", NULL}, {"load_document_thumb", {ca_msg_id, 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", {ca_number, ca_none}, do_load_file, "load_file <msg-id>\tDownloads file to downloads dirs. Prints file name after download end", NULL}, {"load_file", {ca_msg_id, ca_none}, do_load_file, "load_file <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", NULL}, {"load_file_thumb", {ca_msg_id, ca_none}, do_load_file_thumb, "load_file_thumb <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", NULL}, {"load_photo", {ca_msg_id, ca_none}, do_load_photo, "load_photo <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", 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", 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", NULL}, {"load_video", {ca_msg_id, ca_none}, do_load_video, "load_video <msg-id>\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", NULL}, {"load_video_thumb", {ca_msg_id, ca_none}, do_load_video_thumb, "load_video_thumb <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", NULL}, {"main_session", {ca_none}, do_main_session, "main_session\tSends updates to this connection (or terminal). Useful only with listening socket", NULL},
{"mark_read", {ca_peer, ca_none}, do_mark_read, "mark_read <peer>\tMarks messages with peer as read", NULL}, {"mark_read", {ca_peer, ca_none}, do_mark_read, "mark_read <peer>\tMarks messages with peer as read", NULL},
{"msg", {ca_peer, ca_msg_string_end, ca_none}, do_msg, "msg <peer> <text>\tSends text message to peer", NULL}, {"msg", {ca_peer, ca_msg_string_end, ca_none}, do_msg, "msg <peer> <text>\tSends text message to peer", NULL},
@ -1484,19 +1538,19 @@ struct command commands[MAX_COMMANDS_SIZE] = {
{"post_location", {ca_peer, ca_double, ca_double, ca_none}, do_post_location, "post_location <peer> <latitude> <longitude>\tSends geo location", NULL}, {"post_location", {ca_peer, ca_double, ca_double, ca_none}, do_post_location, "post_location <peer> <latitude> <longitude>\tSends geo location", NULL},
{"post_photo", {ca_peer, ca_file_name, ca_string_end | ca_optional, ca_none}, do_post_photo, "post_photo <peer> <file> [caption]\tSends photo to peer", NULL}, {"post_photo", {ca_peer, ca_file_name, ca_string_end | ca_optional, ca_none}, do_post_photo, "post_photo <peer> <file> [caption]\tSends photo to peer", NULL},
{"post_text", {ca_peer, ca_file_name_end, ca_none}, do_post_text, "post_text <peer> <file>\tSends contents of text file as plain text message", NULL}, {"post_text", {ca_peer, ca_file_name_end, ca_none}, do_post_text, "post_text <peer> <file>\tSends contents of text file as plain text message", NULL},
{"pist_video", {ca_peer, ca_file_name, ca_string_end | ca_optional, ca_none}, do_post_video, "post_video <peer> <file> [caption]\tSends video to peer", NULL}, {"post_video", {ca_peer, ca_file_name, ca_string_end | ca_optional, ca_none}, do_post_video, "post_video <peer> <file> [caption]\tSends video to peer", NULL},
{"quit", {ca_none}, do_quit, "quit\tQuits immediately", NULL}, {"quit", {ca_none}, do_quit, "quit\tQuits immediately", NULL},
{"rename_chat", {ca_chat, ca_string_end, ca_none}, do_rename_chat, "rename_chat <chat> <new name>\tRenames chat", NULL}, {"rename_chat", {ca_chat, ca_string_end, ca_none}, do_rename_chat, "rename_chat <chat> <new name>\tRenames chat", NULL},
{"rename_contact", {ca_user, ca_string, ca_string, ca_none}, do_rename_contact, "rename_contact <user> <first name> <last name>\tRenames contact", NULL}, {"rename_contact", {ca_user, ca_string, ca_string, ca_none}, do_rename_contact, "rename_contact <user> <first name> <last name>\tRenames contact", NULL},
{"reply", {ca_number, ca_msg_string_end, ca_none}, do_reply, "reply <msg-id> <text>\tSends text reply to message", NULL}, {"reply", {ca_msg_id, ca_msg_string_end, ca_none}, do_reply, "reply <msg-id> <text>\tSends text reply to message", NULL},
{"reply_audio", {ca_number, ca_file_name, ca_none}, do_send_audio, "reply_audio <msg-id> <file>\tSends audio to peer", NULL}, {"reply_audio", {ca_msg_id, ca_file_name, ca_none}, do_send_audio, "reply_audio <msg-id> <file>\tSends audio to peer", NULL},
{"reply_contact", {ca_number, ca_string, ca_string, ca_string, ca_none}, do_reply_contact, "reply_contact <msg-id> <phone> <first-name> <last-name>\tSends contact (not necessary telegram user)", NULL}, {"reply_contact", {ca_msg_id, ca_string, ca_string, ca_string, ca_none}, do_reply_contact, "reply_contact <msg-id> <phone> <first-name> <last-name>\tSends contact (not necessary telegram user)", NULL},
{"reply_document", {ca_number, ca_file_name, ca_none}, do_reply_document, "reply_document <msg-id> <file>\tSends document to peer", NULL}, {"reply_document", {ca_msg_id, ca_file_name, ca_none}, do_reply_document, "reply_document <msg-id> <file>\tSends document to peer", NULL},
{"reply_file", {ca_number, ca_file_name, ca_none}, do_reply_file, "reply_file <msg-id> <file>\tSends document to peer", NULL}, {"reply_file", {ca_msg_id, ca_file_name, ca_none}, do_reply_file, "reply_file <msg-id> <file>\tSends document to peer", NULL},
{"reply_location", {ca_number, ca_double, ca_double, ca_none}, do_reply_location, "reply_location <msg-id> <latitude> <longitude>\tSends geo location", NULL}, {"reply_location", {ca_msg_id, ca_double, ca_double, ca_none}, do_reply_location, "reply_location <msg-id> <latitude> <longitude>\tSends geo location", NULL},
{"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_photo", {ca_msg_id, 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_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}, //{"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},
{"reply_video", {ca_number, ca_file_name, ca_none}, do_reply_video, "reply_video <msg-id> <file>\tSends video to peer", NULL}, {"reply_video", {ca_msg_id, ca_file_name, ca_none}, do_reply_video, "reply_video <msg-id> <file>\tSends video to peer", NULL},
{"resolve_username", {ca_string, ca_none}, do_resolve_username, "resolve_username username\tSearches user by username", NULL}, {"resolve_username", {ca_string, ca_none}, do_resolve_username, "resolve_username username\tSearches user by username", NULL},
//{"restore_msg", {ca_number, ca_none}, do_restore_msg, "restore_msg <msg-id>\tRestores message. Only available shortly (one hour?) after deletion", NULL}, //{"restore_msg", {ca_number, ca_none}, do_restore_msg, "restore_msg <msg-id>\tRestores message. Only available shortly (one hour?) after deletion", NULL},
{"safe_quit", {ca_none}, do_safe_quit, "safe_quit\tWaits for all queries to end, then quits", NULL}, {"safe_quit", {ca_none}, do_safe_quit, "safe_quit\tWaits for all queries to end, then quits", NULL},
@ -1525,17 +1579,17 @@ struct command commands[MAX_COMMANDS_SIZE] = {
{"status_offline", {ca_none}, do_status_offline, "status_offline\tSets status as offline", NULL}, {"status_offline", {ca_none}, do_status_offline, "status_offline\tSets status as offline", NULL},
{"unblock_user", {ca_user, ca_none}, do_unblock_user, "unblock_user <user>\tUnblocks user", NULL}, {"unblock_user", {ca_user, ca_none}, do_unblock_user, "unblock_user <user>\tUnblocks user", NULL},
{"user_info", {ca_user, ca_none}, do_user_info, "user_info <user>\tPrints info about user (id, last online, phone)", NULL}, {"user_info", {ca_user, ca_none}, do_user_info, "user_info <user>\tPrints info about user (id, last online, phone)", 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", NULL}, {"view_audio", {ca_msg_id, 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_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_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", {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_document", {ca_msg_id, 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_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_document_thumb", {ca_msg_id, 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", {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_file", {ca_msg_id, 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_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_file_thumb", {ca_msg_id, 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_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_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_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_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", {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_video", {ca_msg_id, 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_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}, {"view_video_thumb", {ca_msg_id, 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},
{"view", {ca_number, ca_none}, do_open_any, "view <msg-id>\tTries to view message contents", NULL}, {"view", {ca_msg_id, ca_none}, do_open_any, "view <msg-id>\tTries to view message contents", 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}", 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}", NULL}
}; };
@ -1549,13 +1603,13 @@ void register_new_command (struct command *cmd) {
} }
tgl_peer_t *autocomplete_peer; tgl_peer_t *autocomplete_peer;
int autocomplete_id; tgl_message_id_t autocomplete_id;
enum command_argument get_complete_mode (void) { enum command_argument get_complete_mode (void) {
force_end_mode = 0; force_end_mode = 0;
line_ptr = rl_line_buffer; line_ptr = rl_line_buffer;
autocomplete_peer = NULL; autocomplete_peer = NULL;
autocomplete_id = 0; autocomplete_id.peer_type = NOT_FOUND;
while (1) { while (1) {
next_token (); next_token ();
@ -1614,7 +1668,7 @@ enum command_argument get_complete_mode (void) {
char *save = line_ptr; char *save = line_ptr;
next_token (); next_token ();
if (op == ca_user || op == ca_chat || op == ca_secret_chat || op == ca_peer || op == ca_number || op == ca_double) { if (op == ca_user || op == ca_chat || op == ca_secret_chat || op == ca_peer || op == ca_number || op == ca_double || op == ca_msg_id) {
if (cur_token_quoted) { if (cur_token_quoted) {
if (opt) { if (opt) {
line_ptr = save; line_ptr = save;
@ -1645,14 +1699,17 @@ enum command_argument get_complete_mode (void) {
ok = (tgl_get_peer_type (cur_token_peer ()) != NOT_FOUND); ok = (tgl_get_peer_type (cur_token_peer ()) != NOT_FOUND);
if (ok) { if (ok) {
autocomplete_peer = tgl_peer_get (TLS, cur_token_peer ()); autocomplete_peer = tgl_peer_get (TLS, cur_token_peer ());
autocomplete_id = 0; autocomplete_id.peer_type = NOT_FOUND;
} }
break; break;
case ca_number: case ca_number:
ok = (cur_token_int () != NOT_FOUND); ok = (cur_token_int () != NOT_FOUND);
break;
case ca_msg_id:
ok = (cur_token_msg_id ().peer_type != 0);
if (ok) { if (ok) {
autocomplete_peer = NULL; autocomplete_peer = NULL;
autocomplete_id = cur_token_int (); autocomplete_id = cur_token_msg_id ();
} }
break; break;
case ca_double: case ca_double:
@ -1860,7 +1917,7 @@ char *command_generator (const char *text, int state) {
if (mode != ca_file_name && mode != ca_file_name_end && index == -1) { return 0; } if (mode != ca_file_name && mode != ca_file_name_end && index == -1) { return 0; }
} }
if (mode == ca_none || mode == ca_string || mode == ca_string_end || mode == ca_number || mode == ca_double) { if (mode == ca_none || mode == ca_string || mode == ca_string_end || mode == ca_number || mode == ca_double || mode == ca_msg_id) {
if (c) { rl_line_buffer[rl_point] = c; } if (c) { rl_line_buffer[rl_point] = c; }
return 0; return 0;
} }
@ -1906,8 +1963,8 @@ char *command_generator (const char *text, int state) {
index = complete_chat_command (autocomplete_peer, index, command_pos, command_len, &R); index = complete_chat_command (autocomplete_peer, index, command_pos, command_len, &R);
} }
} }
if (autocomplete_id) { if (autocomplete_id.peer_type != (unsigned)NOT_FOUND) {
struct tgl_message *M = tgl_message_get (TLS, autocomplete_id); struct tgl_message *M = tgl_message_get (TLS, &autocomplete_id);
if (M) { if (M) {
if (command_len > 0 && *command_pos == '/') { if (command_len > 0 && *command_pos == '/') {
tgl_peer_t *P = tgl_peer_get (TLS, M->from_id); tgl_peer_t *P = tgl_peer_get (TLS, M->from_id);
@ -2080,10 +2137,10 @@ void print_msg_list_gw (struct tgl_state *TLSR, void *extra, int success, int nu
void print_msg_list_history_gw (struct tgl_state *TLSR, void *extra, int success, int num, struct tgl_message *ML[]) { void print_msg_list_history_gw (struct tgl_state *TLSR, void *extra, int success, int num, struct tgl_message *ML[]) {
print_msg_list_gw (TLSR, extra, success, num, ML); print_msg_list_gw (TLSR, extra, success, num, ML);
if (num > 0) { if (num > 0) {
if (tgl_get_peer_type (ML[0]->to_id) != TGL_PEER_USER || tgl_get_peer_id (ML[0]->to_id) != TLS->our_id) { if (tgl_cmp_peer_id (ML[0]->to_id, TLS->our_id)) {
tgl_do_messages_mark_read (TLS, ML[0]->to_id, ML[0]->id, 0, NULL, NULL); tgl_do_messages_mark_read (TLS, ML[0]->to_id, ML[0]->server_id, 0, NULL, NULL);
} else { } else {
tgl_do_messages_mark_read (TLS, ML[0]->from_id, ML[0]->id, 0, NULL, NULL); tgl_do_messages_mark_read (TLS, ML[0]->from_id, ML[0]->server_id, 0, NULL, NULL);
} }
} }
} }
@ -2167,6 +2224,75 @@ void print_user_gw (struct tgl_state *TLSR, void *extra, int success, struct tgl
mprint_end (ev); mprint_end (ev);
} }
void print_chat_gw (struct tgl_state *TLSR, void *extra, int success, struct tgl_chat *U) {
assert (TLS == TLSR);
struct in_ev *ev = extra;
if (ev && !--ev->refcnt) {
free (ev);
return;
}
if (!success) { print_fail (ev); return; }
mprint_start (ev);
if (!enable_json) {
print_chat_name (ev, U->id, (void *)U);
mprintf (ev, "\n");
} else {
#ifdef USE_JSON
json_t *res = json_pack_peer (U->id);
char *s = json_dumps (res, 0);
mprintf (ev, "%s\n", s);
json_decref (res);
free (s);
#endif
}
mprint_end (ev);
}
void print_channel_gw (struct tgl_state *TLSR, void *extra, int success, struct tgl_channel *U) {
assert (TLS == TLSR);
struct in_ev *ev = extra;
if (ev && !--ev->refcnt) {
free (ev);
return;
}
if (!success) { print_fail (ev); return; }
mprint_start (ev);
if (!enable_json) {
print_channel_name (ev, U->id, (void *)U);
mprintf (ev, "\n");
} else {
#ifdef USE_JSON
json_t *res = json_pack_peer (U->id);
char *s = json_dumps (res, 0);
mprintf (ev, "%s\n", s);
json_decref (res);
free (s);
#endif
}
mprint_end (ev);
}
void print_peer_gw (struct tgl_state *TLSR, void *extra, int success, tgl_peer_t *U) {
if (!success) {
print_user_gw (TLSR, extra, success, (void *)U);
return;
}
switch (tgl_get_peer_type (U->id)) {
case TGL_PEER_USER:
print_user_gw (TLSR, extra, success, (void *)U);
break;
case TGL_PEER_CHAT:
print_chat_gw (TLSR, extra, success, (void *)U);
break;
case TGL_PEER_CHANNEL:
print_channel_gw (TLSR, extra, success, (void *)U);
break;
default:
assert (0);
}
}
void print_filename_gw (struct tgl_state *TLSR, void *extra, int success, const char *name) { void print_filename_gw (struct tgl_state *TLSR, void *extra, int success, const char *name) {
assert (TLS == TLSR); assert (TLS == TLSR);
struct in_ev *ev = extra; struct in_ev *ev = extra;
@ -2376,7 +2502,7 @@ void print_secret_chat_gw (struct tgl_state *TLSR, void *extra, int success, str
mprint_end (ev); mprint_end (ev);
} }
void print_dialog_list_gw (struct tgl_state *TLSR, void *extra, int success, int size, tgl_peer_id_t peers[], int last_msg_id[], int unread_count[]) { void print_dialog_list_gw (struct tgl_state *TLSR, void *extra, int success, int size, tgl_peer_id_t peers[], tgl_message_id_t *last_msg_id[], int unread_count[]) {
assert (TLS == TLSR); assert (TLS == TLSR);
struct in_ev *ev = extra; struct in_ev *ev = extra;
if (ev && !--ev->refcnt) { if (ev && !--ev->refcnt) {
@ -2473,7 +2599,7 @@ void print_read_list (int num, struct tgl_message *list[]) {
#endif #endif
} }
tgl_peer_id_t to_id; tgl_peer_id_t to_id;
if (tgl_get_peer_type (list[i]->to_id) == TGL_PEER_USER && tgl_get_peer_id (list[i]->to_id) == TLS->our_id) { if (!tgl_cmp_peer_id (list[i]->to_id, TLS->our_id)) {
to_id = list[i]->from_id; to_id = list[i]->from_id;
} else { } else {
to_id = list[i]->to_id; to_id = list[i]->to_id;
@ -2483,7 +2609,7 @@ void print_read_list (int num, struct tgl_message *list[]) {
int c2 = 0; int c2 = 0;
for (j = i; j < num; j++) if (list[j]) { for (j = i; j < num; j++) if (list[j]) {
tgl_peer_id_t end_id; tgl_peer_id_t end_id;
if (tgl_get_peer_type (list[j]->to_id) == TGL_PEER_USER && tgl_get_peer_id (list[j]->to_id) == TLS->our_id) { if (!tgl_cmp_peer_id (list[j]->to_id, TLS->our_id)) {
end_id = list[j]->from_id; end_id = list[j]->from_id;
} else { } else {
end_id = list[j]->to_id; end_id = list[j]->to_id;
@ -2661,7 +2787,7 @@ void print_message_gw (struct tgl_state *TLSR, struct tgl_message *M) {
mprint_end (ev); mprint_end (ev);
} }
void our_id_gw (struct tgl_state *TLSR, int id) { void our_id_gw (struct tgl_state *TLSR, tgl_peer_id_t id) {
assert (TLSR == TLS); assert (TLSR == TLS);
#ifdef USE_LUA #ifdef USE_LUA
lua_our_id (id); lua_our_id (id);
@ -3103,14 +3229,16 @@ void interpreter_ex (char *line, void *ex) {
break; break;
} }
if (op == ca_user || op == ca_chat || op == ca_secret_chat || op == ca_peer || op == ca_number || op == ca_double) { if (op == ca_user || op == ca_chat || op == ca_secret_chat || op == ca_peer || op == ca_number || op == ca_double || op == ca_msg_id) {
if (cur_token_quoted) { if (cur_token_quoted) {
if (opt) { if (opt) {
if (op != ca_number && op != ca_double) { if (op != ca_number && op != ca_double && op != ca_msg_id) {
args[args_num ++].P = 0; args[args_num ++].P = 0;
} else { } else {
if (op == ca_number) { if (op == ca_number) {
args[args_num ++].num = NOT_FOUND; args[args_num ++].num = NOT_FOUND;
} else if (op == ca_msg_id) {
args[args_num ++].msg_id.peer_type = 0;
} else { } else {
args[args_num ++].dval = NOT_FOUND; args[args_num ++].dval = NOT_FOUND;
} }
@ -3128,11 +3256,13 @@ void interpreter_ex (char *line, void *ex) {
} else { } else {
if (cur_token_end_str) { if (cur_token_end_str) {
if (opt) { if (opt) {
if (op != ca_number && op != ca_double) { if (op != ca_number && op != ca_double && op != ca_msg_id) {
args[args_num ++].P = 0; args[args_num ++].P = 0;
} else { } else {
if (op == ca_number) { if (op == ca_number) {
args[args_num ++].num = NOT_FOUND; args[args_num ++].num = NOT_FOUND;
} else if (op == ca_msg_id) {
args[args_num ++].msg_id.peer_type = 0;
} else { } else {
args[args_num ++].dval = NOT_FOUND; args[args_num ++].dval = NOT_FOUND;
} }
@ -3170,6 +3300,10 @@ void interpreter_ex (char *line, void *ex) {
args[args_num ++].num = cur_token_int (); args[args_num ++].num = cur_token_int ();
ok = (args[args_num - 1].num != NOT_FOUND); ok = (args[args_num - 1].num != NOT_FOUND);
break; break;
case ca_msg_id:
args[args_num ++].msg_id = cur_token_msg_id ();
ok = (args[args_num - 1].msg_id.peer_type != 0);
break;
case ca_double: case ca_double:
args[args_num ++].dval = cur_token_double (); args[args_num ++].dval = cur_token_double ();
ok = (args[args_num - 1].dval != NOT_FOUND); ok = (args[args_num - 1].dval != NOT_FOUND);
@ -3624,6 +3758,21 @@ void print_date_full (struct in_ev *ev, long t) {
mprintf (ev, "[%04d/%02d/%02d %02d:%02d:%02d]", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); mprintf (ev, "[%04d/%02d/%02d %02d:%02d:%02d]", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
} }
void print_msg_id (struct in_ev *ev, struct tgl_message *M) {
if (msg_num_mode) {
if (!permanent_id_mode) {
mprintf (ev, "%d ", M->temp_id);
} else {
unsigned char *s = (void *)&M->permanent_id;
int i;
for (i = 0; i < (int)sizeof (struct tgl_message_id); i++) {
mprintf (ev, "%02x", (unsigned)s[i]);
}
}
mprintf (ev, " ");
}
}
void print_service_message (struct in_ev *ev, struct tgl_message *M) { void print_service_message (struct in_ev *ev, struct tgl_message *M) {
assert (M); assert (M);
//print_start (); //print_start ();
@ -3634,9 +3783,7 @@ void print_service_message (struct in_ev *ev, struct tgl_message *M) {
} else { } else {
mpush_color (ev, COLOR_MAGENTA); mpush_color (ev, COLOR_MAGENTA);
} }
if (msg_num_mode) { print_msg_id (ev, M);
mprintf (ev, "%lld ", M->id);
}
print_date (ev, M->date); print_date (ev, M->date);
mpop_color (ev); mpop_color (ev);
mprintf (ev, " "); mprintf (ev, " ");
@ -3765,9 +3912,7 @@ void print_message (struct in_ev *ev, struct tgl_message *M) {
if (tgl_get_peer_type (M->to_id) == TGL_PEER_USER) { if (tgl_get_peer_type (M->to_id) == TGL_PEER_USER) {
if (M->flags & TGLMF_OUT) { if (M->flags & TGLMF_OUT) {
mpush_color (ev, COLOR_GREEN); mpush_color (ev, COLOR_GREEN);
if (msg_num_mode) { print_msg_id (ev, M);
mprintf (ev, "%lld ", M->id);
}
print_date (ev, M->date); print_date (ev, M->date);
mpop_color (ev); mpop_color (ev);
mprintf (ev, " "); mprintf (ev, " ");
@ -3780,9 +3925,7 @@ void print_message (struct in_ev *ev, struct tgl_message *M) {
} }
} else { } else {
mpush_color (ev, COLOR_BLUE); mpush_color (ev, COLOR_BLUE);
if (msg_num_mode) { print_msg_id (ev, M);
mprintf (ev, "%lld ", M->id);
}
print_date (ev, M->date); print_date (ev, M->date);
mpop_color (ev); mpop_color (ev);
mprintf (ev, " "); mprintf (ev, " ");
@ -3799,9 +3942,7 @@ void print_message (struct in_ev *ev, struct tgl_message *M) {
assert (P); assert (P);
if (M->flags & TGLMF_UNREAD) { if (M->flags & TGLMF_UNREAD) {
mpush_color (ev, COLOR_GREEN); mpush_color (ev, COLOR_GREEN);
if (msg_num_mode) { print_msg_id (ev, M);
mprintf (ev, "%lld ", M->id);
}
print_date (ev, M->date); print_date (ev, M->date);
mprintf (ev, " "); mprintf (ev, " ");
mpush_color (ev, COLOR_CYAN); mpush_color (ev, COLOR_CYAN);
@ -3814,9 +3955,7 @@ void print_message (struct in_ev *ev, struct tgl_message *M) {
} }
} else { } else {
mpush_color (ev, COLOR_BLUE); mpush_color (ev, COLOR_BLUE);
if (msg_num_mode) { print_msg_id (ev, M);
mprintf (ev, "%lld ", M->id);
}
print_date (ev, M->date); print_date (ev, M->date);
mpush_color (ev, COLOR_CYAN); mpush_color (ev, COLOR_CYAN);
mprintf (ev, " %s", P->print_name); mprintf (ev, " %s", P->print_name);
@ -3829,16 +3968,14 @@ void print_message (struct in_ev *ev, struct tgl_message *M) {
} }
} else if (tgl_get_peer_type (M->to_id) == TGL_PEER_CHAT) { } else if (tgl_get_peer_type (M->to_id) == TGL_PEER_CHAT) {
mpush_color (ev, COLOR_MAGENTA); mpush_color (ev, COLOR_MAGENTA);
if (msg_num_mode) { print_msg_id (ev, M);
mprintf (ev, "%lld ", M->id);
}
print_date (ev, M->date); print_date (ev, M->date);
mpop_color (ev); mpop_color (ev);
mprintf (ev, " "); mprintf (ev, " ");
print_chat_name (ev, M->to_id, tgl_peer_get (TLS, M->to_id)); print_chat_name (ev, M->to_id, tgl_peer_get (TLS, M->to_id));
mprintf (ev, " "); mprintf (ev, " ");
print_user_name (ev, M->from_id, tgl_peer_get (TLS, M->from_id)); print_user_name (ev, M->from_id, tgl_peer_get (TLS, M->from_id));
if ((tgl_get_peer_type (M->from_id) == TGL_PEER_USER) && (tgl_get_peer_id (M->from_id) == TLS->our_id)) { if (!tgl_cmp_peer_id (M->from_id, TLS->our_id)) {
mpush_color (ev, COLOR_GREEN); mpush_color (ev, COLOR_GREEN);
} else { } else {
mpush_color (ev, COLOR_BLUE); mpush_color (ev, COLOR_BLUE);
@ -3852,9 +3989,7 @@ void print_message (struct in_ev *ev, struct tgl_message *M) {
assert (tgl_get_peer_type (M->to_id) == TGL_PEER_CHANNEL); assert (tgl_get_peer_type (M->to_id) == TGL_PEER_CHANNEL);
mpush_color (ev, COLOR_CYAN); mpush_color (ev, COLOR_CYAN);
if (msg_num_mode) { print_msg_id (ev, M);
mprintf (ev, "%lld ", M->id);
}
print_date (ev, M->date); print_date (ev, M->date);
mpop_color (ev); mpop_color (ev);
mprintf (ev, " "); mprintf (ev, " ");
@ -3863,7 +3998,7 @@ void print_message (struct in_ev *ev, struct tgl_message *M) {
if (tgl_get_peer_type (M->from_id) == TGL_PEER_USER) { if (tgl_get_peer_type (M->from_id) == TGL_PEER_USER) {
mprintf (ev, " "); mprintf (ev, " ");
print_user_name (ev, M->from_id, tgl_peer_get (TLS, M->from_id)); print_user_name (ev, M->from_id, tgl_peer_get (TLS, M->from_id));
if ((tgl_get_peer_type (M->from_id) == TGL_PEER_USER) && (tgl_get_peer_id (M->from_id) == TLS->our_id)) { if (!tgl_cmp_peer_id (M->from_id, TLS->our_id)) {
mpush_color (ev, COLOR_GREEN); mpush_color (ev, COLOR_GREEN);
} else { } else {
mpush_color (ev, COLOR_BLUE); mpush_color (ev, COLOR_BLUE);

13
loop.c
View File

@ -70,6 +70,7 @@
#include <tgl/tgl-binlog.h> #include <tgl/tgl-binlog.h>
#include <tgl/tgl-net.h> #include <tgl/tgl-net.h>
#include <tgl/tgl-timers.h> #include <tgl/tgl-timers.h>
#include <tgl/tgl-queries.h>
#include <openssl/sha.h> #include <openssl/sha.h>
@ -349,13 +350,13 @@ void net_loop (void) {
write_state_file (); write_state_file ();
update_prompt (); update_prompt ();
if (unknown_user_list_pos) { /* if (unknown_user_list_pos) {
int i; int i;
for (i = 0; i < unknown_user_list_pos; i++) { for (i = 0; i < unknown_user_list_pos; i++) {
tgl_do_get_user_info (TLS, TGL_MK_USER (unknown_user_list[i]), 0, 0, 0); tgl_do_get_user_info (TLS, TGL_MK_USER (unknown_user_list[i]), 0, 0, 0);
} }
unknown_user_list_pos = 0; unknown_user_list_pos = 0;
} } */
} }
if (term_ev) { if (term_ev) {
@ -484,7 +485,7 @@ void write_auth_file (void) {
tgl_dc_iterator_ex (TLS, write_dc, &auth_file_fd); tgl_dc_iterator_ex (TLS, write_dc, &auth_file_fd);
assert (write (auth_file_fd, &TLS->our_id, 4) == 4); assert (write (auth_file_fd, &TLS->our_id.peer_id, 4) == 4);
close (auth_file_fd); close (auth_file_fd);
} }
@ -611,7 +612,7 @@ void read_auth_file (void) {
assert (!l); assert (!l);
} }
if (our_id) { if (our_id) {
bl_do_set_our_id (TLS, our_id); bl_do_set_our_id (TLS, TGL_MK_USER (our_id));
} }
close (auth_file_fd); close (auth_file_fd);
} }
@ -759,7 +760,7 @@ void on_login (struct tgl_state *TLS) {
} }
void on_started (struct tgl_state *TLS); void on_started (struct tgl_state *TLS);
void dlist_cb (struct tgl_state *TLSR, void *callback_extra, int success, int size, tgl_peer_id_t peers[], int last_msg_id[], int unread_count[]) { void dlist_cb (struct tgl_state *TLSR, void *callback_extra, int success, int size, tgl_peer_id_t peers[], tgl_message_id_t *last_msg_id[], int unread_count[]) {
on_started (TLS); on_started (TLS);
} }
@ -850,7 +851,7 @@ int loop (void) {
update_prompt (); update_prompt ();
if (reset_authorization) { if (reset_authorization) {
tgl_peer_t *P = tgl_peer_get (TLS, TGL_MK_USER (TLS->our_id)); tgl_peer_t *P = tgl_peer_get (TLS, TLS->our_id);
if (P && P->user.phone && reset_authorization == 1) { if (P && P->user.phone && reset_authorization == 1) {
set_default_username (P->user.phone); set_default_username (P->user.phone);
} }

View File

@ -431,8 +431,14 @@ void push_message (struct tgl_message *M) {
my_lua_checkstack (luaState, 10); my_lua_checkstack (luaState, 10);
lua_newtable (luaState); lua_newtable (luaState);
static char s[30]; static char s[256];
snprintf (s, 30, "%lld", M->id); unsigned char *mid = (void *)&M->permanent_id;
int i;
for (i = 0; i < (int)sizeof (struct tgl_message_permanent_id); i++) {
sprintf (s + 2 * i, "%02u", (unsigned) mid[i]);
}
lua_add_string_field ("id", s); lua_add_string_field ("id", s);
if (!(M->flags & TGLMF_CREATED)) { return; } if (!(M->flags & TGLMF_CREATED)) { return; }
lua_add_num_field ("flags", M->flags); lua_add_num_field ("flags", M->flags);

2
tgl

@ -1 +1 @@
Subproject commit 1cdaac625b8af7312b909d8cbb655ec2807543c5 Subproject commit 23ff689b27ba19f8beb37467ce00c9e062d9e688