Commit 9ebb3f73 authored by Vysheng's avatar Vysheng

Added chat_with_peer command

parent 2c9e51b4
...@@ -1046,6 +1046,22 @@ void replay_log_event (void) { ...@@ -1046,6 +1046,22 @@ void replay_log_event (void) {
} }
} }
break; break;
case CODE_binlog_delete_msg:
rptr ++;
{
struct message *M = message_get (*(long long *)rptr);
rptr += 2;
assert (M);
if (M->flags & FLAG_PENDING) {
message_remove_unsent (M);
M->flags &= ~FLAG_PENDING;
}
message_remove_tree (M);
message_del_peer (M);
free_message (M);
free (M);
}
break;
case CODE_update_user_photo: case CODE_update_user_photo:
case CODE_update_user_name: case CODE_update_user_name:
work_update_binlog (); work_update_binlog ();
...@@ -1751,3 +1767,10 @@ void bl_do_set_msg_id (struct message *M, int id) { ...@@ -1751,3 +1767,10 @@ void bl_do_set_msg_id (struct message *M, int id) {
out_int (id); out_int (id);
add_log_event (packet_buffer, 4 * (packet_ptr - packet_buffer)); add_log_event (packet_buffer, 4 * (packet_ptr - packet_buffer));
} }
void bl_do_delete_msg (struct message *M) {
clear_packet ();
out_int (CODE_binlog_delete_msg);
out_long (M->id);
add_log_event (packet_buffer, 4 * (packet_ptr - packet_buffer));
}
...@@ -81,6 +81,7 @@ ...@@ -81,6 +81,7 @@
#define CODE_binlog_set_msg_id 0xf3285b6a #define CODE_binlog_set_msg_id 0xf3285b6a
#define CODE_binlog_create_message_media_encr 0x19cd7c9d #define CODE_binlog_create_message_media_encr 0x19cd7c9d
#define CODE_binlog_create_message_service_encr 0x8b4b9395 #define CODE_binlog_create_message_service_encr 0x8b4b9395
#define CODE_binlog_delete_msg 0xa1d6ab6d
void *alloc_log_event (int l); void *alloc_log_event (int l);
void replay_log (void); void replay_log (void);
...@@ -145,4 +146,5 @@ void bl_do_send_message_text (long long msg_id, int from_id, int to_type, int to ...@@ -145,4 +146,5 @@ void bl_do_send_message_text (long long msg_id, int from_id, int to_type, int to
void bl_do_set_unread (struct message *M, int unread); void bl_do_set_unread (struct message *M, int unread);
void bl_do_set_message_sent (struct message *M); void bl_do_set_message_sent (struct message *M);
void bl_do_set_msg_id (struct message *M, int id); void bl_do_set_msg_id (struct message *M, int id);
void bl_do_delete_msg (struct message *M);
#endif #endif
...@@ -63,6 +63,9 @@ char *line_ptr; ...@@ -63,6 +63,9 @@ char *line_ptr;
extern peer_t *Peers[]; extern peer_t *Peers[];
extern int peer_num; extern int peer_num;
int in_chat_mode;
peer_id_t chat_mode_id;
int is_same_word (const char *s, size_t l, const char *word) { int is_same_word (const char *s, size_t l, const char *word) {
return s && word && strlen (word) == l && !memcmp (s, word, l); return s && word && strlen (word) == l && !memcmp (s, word, l);
...@@ -204,9 +207,15 @@ peer_id_t next_token_peer (void) { ...@@ -204,9 +207,15 @@ peer_id_t next_token_peer (void) {
} }
char *get_default_prompt (void) { char *get_default_prompt (void) {
static char buf[100]; static char buf[1000];
int l = 0;
if (in_chat_mode) {
peer_t *U = user_chat_get (chat_mode_id);
assert (U && U->print_name);
l += sprintf (buf + l, COLOR_RED "%.*s " COLOR_NORMAL, 100, U->print_name);
}
if (unread_messages || cur_uploading_bytes || cur_downloading_bytes) { if (unread_messages || cur_uploading_bytes || cur_downloading_bytes) {
int l = sprintf (buf, COLOR_RED "["); l += sprintf (buf + l, COLOR_RED "[");
int ok = 0; int ok = 0;
if (unread_messages) { if (unread_messages) {
l += sprintf (buf + l, "%d unread", unread_messages); l += sprintf (buf + l, "%d unread", unread_messages);
...@@ -222,11 +231,11 @@ char *get_default_prompt (void) { ...@@ -222,11 +231,11 @@ char *get_default_prompt (void) {
ok = 1; ok = 1;
l += sprintf (buf + l, "%lld%%Down", 100 * cur_downloaded_bytes / cur_downloading_bytes); l += sprintf (buf + l, "%lld%%Down", 100 * cur_downloaded_bytes / cur_downloading_bytes);
} }
sprintf (buf + l, "]" COLOR_NORMAL "%s", default_prompt); l += sprintf (buf + l, "]" COLOR_NORMAL);
return buf; return buf;
} else {
return default_prompt;
} }
l += sprintf (buf + l, "%s", default_prompt);
return buf;
} }
char *complete_none (const char *text UU, int state UU) { char *complete_none (const char *text UU, int state UU) {
...@@ -252,6 +261,12 @@ char *modifiers[] = { ...@@ -252,6 +261,12 @@ char *modifiers[] = {
0 0
}; };
char *in_chat_commands[] = {
"/exit",
"/quit",
0
};
char *commands[] = { char *commands[] = {
"help", "help",
"msg", "msg",
...@@ -296,6 +311,7 @@ char *commands[] = { ...@@ -296,6 +311,7 @@ char *commands[] = {
"load_document", "load_document",
"view_document", "view_document",
"set", "set",
"chat_with_peer",
0 }; 0 };
int commands_flags[] = { int commands_flags[] = {
...@@ -342,6 +358,7 @@ int commands_flags[] = { ...@@ -342,6 +358,7 @@ int commands_flags[] = {
07, 07,
07, 07,
07, 07,
072,
}; };
...@@ -452,6 +469,12 @@ int complete_string_list (char **list, int index, const char *text, int len, cha ...@@ -452,6 +469,12 @@ int complete_string_list (char **list, int index, const char *text, int len, cha
char *command_generator (const char *text, int state) { char *command_generator (const char *text, int state) {
static int len, index, mode; static int len, index, mode;
if (in_chat_mode) {
char *R = 0;
index = complete_string_list (in_chat_commands, index, text, rl_point, &R);
return R;
}
char c = 0; char c = 0;
if (!state) { if (!state) {
len = strlen (text); len = strlen (text);
...@@ -521,10 +544,27 @@ void work_modifier (const char *s, int l) { ...@@ -521,10 +544,27 @@ void work_modifier (const char *s, int l) {
#endif #endif
} }
void interpreter_chat_mode (char *line) {
if (!strncmp (line, "/exit", 5) || !strncmp (line, "/quit", 5)) {
in_chat_mode = 0;
update_prompt ();
return;
}
do_send_message (chat_mode_id, line, strlen (line));
}
void interpreter (char *line UU) { void interpreter (char *line UU) {
line_ptr = line;
assert (!in_readline); assert (!in_readline);
in_readline = 1; in_readline = 1;
if (in_chat_mode) {
interpreter_chat_mode (line);
in_readline = 0;
return;
}
line_ptr = line;
offline_mode = 0; offline_mode = 0;
count = 1; count = 1;
if (!line) { if (!line) {
...@@ -1002,6 +1042,10 @@ void interpreter (char *line UU) { ...@@ -1002,6 +1042,10 @@ void interpreter (char *line UU) {
} else if (IS_WORD ("msg_num")) { } else if (IS_WORD ("msg_num")) {
msg_num_mode = num; msg_num_mode = num;
} }
} else if (IS_WORD ("chat_with_peer")) {
GET_PEER;
in_chat_mode = 1;
chat_mode_id = id;
} else if (IS_WORD ("quit")) { } else if (IS_WORD ("quit")) {
exit (0); exit (0);
} }
......
...@@ -845,8 +845,16 @@ int msg_send_on_answer (struct query *q UU) { ...@@ -845,8 +845,16 @@ int msg_send_on_answer (struct query *q UU) {
return 0; return 0;
} }
int msg_send_on_error (struct query *q, int error_code, int error_len, char *error) {
logprintf ( "error for query #%lld: #%d :%.*s\n", q->msg_id, error_code, error_len, error);
struct message *M = q->extra;
bl_do_delete_msg (M);
return 0;
}
struct query_methods msg_send_methods = { struct query_methods msg_send_methods = {
.on_answer = msg_send_on_answer .on_answer = msg_send_on_answer,
.on_error = msg_send_on_error
}; };
struct query_methods msg_send_encr_methods = { struct query_methods msg_send_encr_methods = {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment