@@ -42,6 +42,7 @@ lua_State *luaState;
42
42
//#include "interface.h"
43
43
//#include "auto/constants.h"
44
44
#include <tgl/tgl.h>
45
+ #include <tgl/tgl-queries.h>
45
46
#include "interface.h"
46
47
47
48
#include <assert.h>
@@ -78,7 +79,7 @@ void lua_add_lstring_field (const char *name, const char *value, int len) {
78
79
if (!value || !len ) { return ; }
79
80
my_lua_checkstack (luaState , 3 );
80
81
lua_pushstring (luaState , name );
81
- lua_pushlstring (luaState , len , value );
82
+ lua_pushlstring (luaState , value , len );
82
83
lua_settable (luaState , -3 );
83
84
}
84
85
@@ -158,11 +159,11 @@ void push_encr_chat (tgl_peer_t *P) {
158
159
159
160
void push_channel (tgl_peer_t * P ) {
160
161
my_lua_checkstack (luaState , 4 );
161
- lua_add_string_field (luaState , "title" , P -> channel .title );
162
- lua_add_string_field (luaState , "about" , P -> channel .about );
163
- lua_add_num_field (luaState , "participants_count" , P -> channel .participants_count );
164
- lua_add_num_field (luaState , "admins_count" , P -> channel .admins_count );
165
- lua_add_num_field (luaState , "kicked_count" , P -> channel .kicked_count );
162
+ lua_add_string_field ("title" , P -> channel .title );
163
+ lua_add_string_field ("about" , P -> channel .about );
164
+ lua_add_num_field ("participants_count" , P -> channel .participants_count );
165
+ lua_add_num_field ("admins_count" , P -> channel .admins_count );
166
+ lua_add_num_field ("kicked_count" , P -> channel .kicked_count );
166
167
}
167
168
168
169
void push_update_types (unsigned flags ) {
@@ -225,8 +226,10 @@ void push_update_types (unsigned flags) {
225
226
void push_peer (tgl_peer_id_t id , tgl_peer_t * P ) {
226
227
lua_newtable (luaState );
227
228
228
- lua_add_lstring_field ("id" , print_permanent_peer_id (P -> id ));
229
- lua_add_string_field (luaState , "type" , tgl_get_peer_type (id ));
229
+ lua_add_string_field ("id" , print_permanent_peer_id (P -> id ));
230
+ lua_pushstring (luaState , "type" );
231
+ push_tgl_peer_type (tgl_get_peer_type (P -> id ));
232
+ lua_settable (luaState , -3 );
230
233
231
234
if (!P || !(P -> flags & TGLPF_CREATED )) {
232
235
lua_pushstring (luaState , "print_name" );
@@ -441,9 +444,9 @@ void push_service (struct tgl_message *M) {
441
444
lua_add_string_field ("type" , "channel_created" );
442
445
lua_add_string_field ("title" , M -> action .title );
443
446
break ;
444
- /* default:
447
+ default :
445
448
lua_pushstring (luaState , "???" );
446
- break;*/
449
+ break ;
447
450
}
448
451
}
449
452
@@ -544,13 +547,13 @@ void lua_diff_end (void) {
544
547
}
545
548
}
546
549
547
- void lua_our_id (int id ) {
550
+ void lua_our_id (tgl_peer_id_t id ) {
548
551
if (!have_file ) { return ; }
549
552
lua_settop (luaState , 0 );
550
553
//lua_checkstack (luaState, 20);
551
554
my_lua_checkstack (luaState , 20 );
552
555
lua_getglobal (luaState , "on_our_id" );
553
- lua_pushnumber (luaState , id );
556
+ lua_pushnumber (luaState , tgl_get_peer_id ( id ) );
554
557
assert (lua_gettop (luaState ) == 2 );
555
558
556
559
int r = ps_lua_pcall (luaState , 1 , 0 , 0 );
@@ -626,7 +629,19 @@ void lua_chat_update (struct tgl_chat *C, unsigned flags) {
626
629
//extern int peer_num;
627
630
628
631
#define MAX_LUA_COMMANDS 1000
629
- void * lua_ptr [MAX_LUA_COMMANDS ];
632
+
633
+ struct lua_arg {
634
+ int flags ;
635
+ union {
636
+ tgl_message_id_t msg_id ;
637
+ tgl_peer_id_t peer_id ;
638
+ char * str ;
639
+ long long num ;
640
+ double dval ;
641
+ void * ptr ;
642
+ };
643
+ };
644
+ struct lua_arg lua_ptr [MAX_LUA_COMMANDS ];
630
645
static int pos ;
631
646
632
647
static inline tgl_peer_t * get_peer (const char * s ) {
@@ -750,7 +765,7 @@ void lua_contact_list_cb (struct tgl_state *TLSR, void *cb_extra, int success, i
750
765
free (cb );
751
766
}
752
767
753
- void lua_dialog_list_cb (struct tgl_state * TLSR , void * cb_extra , int success , int num , tgl_peer_id_t peers [], int msgs [], int unread []) {
768
+ void lua_dialog_list_cb (struct tgl_state * TLSR , void * cb_extra , int success , int num , tgl_peer_id_t peers [], tgl_message_id_t * msgs [], int unread []) {
754
769
assert (TLSR == TLS );
755
770
struct lua_query_extra * cb = cb_extra ;
756
771
lua_settop (luaState , 0 );
@@ -1034,106 +1049,102 @@ void lua_str_cb (struct tgl_state *TLSR, void *cb_extra, int success, const char
1034
1049
free (cb );
1035
1050
}
1036
1051
1052
+ #define LUA_STR_ARG (n ) lua_ptr[n].str, strlen (lua_ptr[n].str)
1053
+
1037
1054
void lua_do_all (void ) {
1038
1055
int p = 0 ;
1039
1056
while (p < pos ) {
1040
- int l = ( long ) lua_ptr [p ++ ];
1057
+ int l = lua_ptr [p ++ ]. num ;
1041
1058
assert (p + l + 1 <= pos );
1042
- enum lua_query_type f = ( long ) lua_ptr [p ++ ];
1059
+ enum lua_query_type f = lua_ptr [p ++ ]. num ;
1043
1060
struct tgl_message * M ;
1044
1061
char * s , * s1 , * s2 , * s3 ;
1062
+ int q = p ;
1063
+ tgl_message_id_t * tmp_msg_id ;
1045
1064
switch (f ) {
1046
1065
case lq_contact_list :
1047
- tgl_do_update_contact_list (TLS , lua_contact_list_cb , lua_ptr [p ++ ]);
1066
+ tgl_do_update_contact_list (TLS , lua_contact_list_cb , lua_ptr [p ++ ]. ptr );
1048
1067
break ;
1049
1068
case lq_dialog_list :
1050
- tgl_do_get_dialog_list (TLS , 100 , 0 , lua_dialog_list_cb , lua_ptr [p ++ ]);
1069
+ tgl_do_get_dialog_list (TLS , 100 , 0 , lua_dialog_list_cb , lua_ptr [p ++ ]. ptr );
1051
1070
break ;
1052
1071
case lq_msg :
1053
- tgl_do_send_message (TLS , ((tgl_peer_t * )lua_ptr [p + 1 ])-> id , lua_ptr [p + 2 ], strlen (lua_ptr [p + 2 ]), 0 , NULL , lua_msg_cb , lua_ptr [p ]);
1054
- free (lua_ptr [p + 2 ]);
1072
+ tgl_do_send_message (TLS , lua_ptr [p + 1 ].peer_id , LUA_STR_ARG (p + 2 ), 0 , NULL , lua_msg_cb , lua_ptr [p ].ptr );
1055
1073
p += 3 ;
1056
1074
break ;
1057
1075
case lq_send_typing :
1058
- tgl_do_send_typing (TLS , (( tgl_peer_t * ) lua_ptr [p + 1 ]) -> id , tgl_typing_typing , lua_empty_cb , lua_ptr [p ]);
1076
+ tgl_do_send_typing (TLS , lua_ptr [p + 1 ]. peer_id , tgl_typing_typing , lua_empty_cb , lua_ptr [p ]. ptr );
1059
1077
p += 2 ;
1060
1078
break ;
1061
1079
case lq_send_typing_abort :
1062
- tgl_do_send_typing (TLS , (( tgl_peer_t * ) lua_ptr [p + 1 ]) -> id , tgl_typing_cancel , lua_empty_cb , lua_ptr [p ]);
1080
+ tgl_do_send_typing (TLS , lua_ptr [p + 1 ]. peer_id , tgl_typing_cancel , lua_empty_cb , lua_ptr [p ]. ptr );
1063
1081
p += 2 ;
1064
1082
break ;
1065
1083
case lq_rename_chat :
1066
- tgl_do_rename_chat (TLS , ((tgl_peer_t * )lua_ptr [p + 1 ])-> id , lua_ptr [p + 2 ], strlen (lua_ptr [p + 2 ]), lua_empty_cb , lua_ptr [p ]);
1067
- free (lua_ptr [p + 2 ]);
1084
+ tgl_do_rename_chat (TLS , lua_ptr [p + 1 ].peer_id , LUA_STR_ARG (p + 2 ), lua_empty_cb , lua_ptr [p ].ptr );
1068
1085
p += 3 ;
1069
1086
break ;
1070
1087
case lq_send_photo :
1071
- tgl_do_send_document (TLS , ((tgl_peer_t * )lua_ptr [p + 1 ])-> id , lua_ptr [p + 2 ], NULL , 0 , TGL_SEND_MSG_FLAG_DOCUMENT_PHOTO , lua_msg_cb , lua_ptr [p ]);
1072
- free (lua_ptr [p + 2 ]);
1088
+ tgl_do_send_document (TLS , lua_ptr [p + 1 ].peer_id , lua_ptr [p + 2 ].str , NULL , 0 , TGL_SEND_MSG_FLAG_DOCUMENT_PHOTO , lua_msg_cb , lua_ptr [p ].ptr );
1073
1089
p += 3 ;
1074
1090
break ;
1075
1091
case lq_send_video :
1076
- tgl_do_send_document (TLS , ((tgl_peer_t * )lua_ptr [p + 1 ])-> id , lua_ptr [p + 2 ], NULL , 0 , TGL_SEND_MSG_FLAG_DOCUMENT_VIDEO , lua_msg_cb , lua_ptr [p ]);
1077
- free (lua_ptr [p + 2 ]);
1092
+ tgl_do_send_document (TLS , lua_ptr [p + 1 ].peer_id , lua_ptr [p + 2 ].str , NULL , 0 , TGL_SEND_MSG_FLAG_DOCUMENT_VIDEO , lua_msg_cb , lua_ptr [p ].ptr );
1078
1093
p += 3 ;
1079
1094
break ;
1080
1095
case lq_send_audio :
1081
- tgl_do_send_document (TLS , ((tgl_peer_t * )lua_ptr [p + 1 ])-> id , lua_ptr [p + 2 ], NULL , 0 , TGL_SEND_MSG_FLAG_DOCUMENT_AUDIO , lua_msg_cb , lua_ptr [p ]);
1082
- free (lua_ptr [p + 2 ]);
1096
+ tgl_do_send_document (TLS , lua_ptr [p + 1 ].peer_id , lua_ptr [p + 2 ].str , NULL , 0 , TGL_SEND_MSG_FLAG_DOCUMENT_AUDIO , lua_msg_cb , lua_ptr [p ].ptr );
1083
1097
p += 3 ;
1084
1098
break ;
1085
1099
case lq_send_document :
1086
- tgl_do_send_document (TLS , ((tgl_peer_t * )lua_ptr [p + 1 ])-> id , lua_ptr [p + 2 ], NULL , 0 , 0 , lua_msg_cb , lua_ptr [p ]);
1087
- free (lua_ptr [p + 2 ]);
1100
+ tgl_do_send_document (TLS , lua_ptr [p + 1 ].peer_id , lua_ptr [p + 2 ].str , NULL , 0 , 0 , lua_msg_cb , lua_ptr [p ].ptr );
1088
1101
p += 3 ;
1089
1102
break ;
1090
1103
case lq_send_file :
1091
- tgl_do_send_document (TLS , ((tgl_peer_t * )lua_ptr [p + 1 ])-> id , lua_ptr [p + 2 ], NULL , 0 , TGL_SEND_MSG_FLAG_DOCUMENT_AUTO , lua_msg_cb , lua_ptr [p ]);
1092
- free (lua_ptr [p + 2 ]);
1104
+ tgl_do_send_document (TLS , lua_ptr [p + 1 ].peer_id , lua_ptr [p + 2 ].str , NULL , 0 , TGL_SEND_MSG_FLAG_DOCUMENT_AUTO , lua_msg_cb , lua_ptr [p ].ptr );
1093
1105
p += 3 ;
1094
1106
break ;
1095
1107
case lq_send_text :
1096
- tgl_do_send_text (TLS , ((tgl_peer_t * )lua_ptr [p + 1 ])-> id , lua_ptr [p + 2 ], 0 , lua_msg_cb , lua_ptr [p ]);
1097
- free (lua_ptr [p + 2 ]);
1108
+ tgl_do_send_text (TLS , lua_ptr [p + 1 ].peer_id , lua_ptr [p + 2 ].str , 0 , lua_msg_cb , lua_ptr [p ].ptr );
1098
1109
p += 3 ;
1099
1110
break ;
1100
1111
case lq_chat_set_photo :
1101
- tgl_do_set_chat_photo (TLS , ((tgl_peer_t * )lua_ptr [p + 1 ])-> id , lua_ptr [p + 2 ], lua_empty_cb , lua_ptr [p ]);
1102
- free (lua_ptr [p + 2 ]);
1112
+ tgl_do_set_chat_photo (TLS , lua_ptr [p + 1 ].peer_id , lua_ptr [p + 2 ].str , lua_empty_cb , lua_ptr [p ].ptr );
1103
1113
p += 3 ;
1104
1114
break ;
1105
1115
case lq_load_photo :
1106
1116
case lq_load_video :
1107
1117
case lq_load_audio :
1108
1118
case lq_load_document :
1109
- M = lua_ptr [p + 1 ];
1119
+ M = tgl_message_get ( TLS , & lua_ptr [p + 1 ]. msg_id ) ;
1110
1120
if (!M || (M -> media .type != tgl_message_media_photo && M -> media .type != tgl_message_media_document && M -> media .type != tgl_message_media_document_encr )) {
1111
- lua_file_cb (TLS , lua_ptr [p ], 0 , 0 );
1121
+ lua_file_cb (TLS , lua_ptr [p ]. ptr , 0 , 0 );
1112
1122
} else {
1113
1123
if (M -> media .type == tgl_message_media_photo ) {
1114
1124
assert (M -> media .photo );
1115
- tgl_do_load_photo (TLS , M -> media .photo , lua_file_cb , lua_ptr [p ]);
1125
+ tgl_do_load_photo (TLS , M -> media .photo , lua_file_cb , lua_ptr [p ]. ptr );
1116
1126
} else if (M -> media .type == tgl_message_media_document ) {
1117
1127
assert (M -> media .document );
1118
- tgl_do_load_document (TLS , M -> media .document , lua_file_cb , lua_ptr [p ]);
1128
+ tgl_do_load_document (TLS , M -> media .document , lua_file_cb , lua_ptr [p ]. ptr );
1119
1129
} else {
1120
- tgl_do_load_encr_document (TLS , M -> media .encr_document , lua_file_cb , lua_ptr [p ]);
1130
+ tgl_do_load_encr_document (TLS , M -> media .encr_document , lua_file_cb , lua_ptr [p ]. ptr );
1121
1131
}
1122
1132
}
1123
1133
p += 2 ;
1124
1134
break ;
1125
1135
case lq_load_video_thumb :
1126
1136
case lq_load_document_thumb :
1127
- M = lua_ptr [p + 1 ];
1137
+ M = tgl_message_get ( TLS , & lua_ptr [p + 1 ]. msg_id ) ;
1128
1138
if (!M || (M -> media .type != tgl_message_media_document )) {
1129
- lua_file_cb (TLS , lua_ptr [p ], 0 , 0 );
1139
+ lua_file_cb (TLS , lua_ptr [p ]. ptr , 0 , 0 );
1130
1140
} else {
1131
- tgl_do_load_document_thumb (TLS , M -> media .document , lua_file_cb , lua_ptr [p ]);
1141
+ tgl_do_load_document_thumb (TLS , M -> media .document , lua_file_cb , lua_ptr [p ]. ptr );
1132
1142
}
1133
1143
p += 2 ;
1134
1144
break ;
1135
1145
case lq_fwd :
1136
- tgl_do_forward_message (TLS , ((tgl_peer_t * )lua_ptr [p + 1 ])-> id , ((struct tgl_message * )lua_ptr [p + 2 ])-> id , 0 , lua_msg_cb , lua_ptr [p ]);
1146
+ tmp_msg_id = & lua_ptr [p + 2 ].msg_id ;
1147
+ tgl_do_forward_messages (TLS , lua_ptr [p + 1 ].peer_id , 1 , & tmp_msg_id , 0 , lua_msg_cb , lua_ptr [p ].ptr );
1137
1148
p += 3 ;
1138
1149
break ;
1139
1150
case lq_fwd_media :
0 commit comments