diff --git a/python-tg.c b/python-tg.c index bb55972..4432996 100644 --- a/python-tg.c +++ b/python-tg.c @@ -47,1421 +47,1420 @@ extern int verbosity; extern struct tgl_state *TLS; static int have_file; - -#define my_lua_checkstack(L,x) assert (lua_checkstack (L, x)) -void push_user (tgl_peer_t *P); -void push_peer (tgl_peer_id_t id, tgl_peer_t *P); - -void lua_add_string_field (const char *name, const char *value) { - assert (name && strlen (name)); - if (!value || !strlen (value)) { return; } - my_lua_checkstack (luaState, 3); - lua_pushstring (luaState, name); - lua_pushstring (luaState, value); - lua_settable (luaState, -3); +// +//void push_user (tgl_peer_t *P); +//void push_peer (tgl_peer_id_t id, tgl_peer_t *P); +// +//void lua_add_string_field (const char *name, const char *value) { +// assert (name && strlen (name)); +// if (!value || !strlen (value)) { return; } +// my_lua_checkstack (luaState, 3); +// lua_pushstring (luaState, name); +// lua_pushstring (luaState, value); +// lua_settable (luaState, -3); +//} +// +//void lua_add_string_field_arr (int num, const char *value) { +// if (!value || !strlen (value)) { return; } +// my_lua_checkstack (luaState, 3); +// lua_pushnumber (luaState, num); +// lua_pushstring (luaState, value); +// lua_settable (luaState, -3); +//} +// +//void lua_add_num_field (const char *name, double value) { +// assert (name && strlen (name)); +// my_lua_checkstack (luaState, 3); +// lua_pushstring (luaState, name); +// lua_pushnumber (luaState, value); +// lua_settable (luaState, -3); +//} +// +//void push_tgl_peer_type (int x) { +// switch (x) { +// case TGL_PEER_USER: +// lua_pushstring (luaState, "user"); +// break; +// case TGL_PEER_CHAT: +// lua_pushstring (luaState, "chat"); +// break; +// case TGL_PEER_ENCR_CHAT: +// lua_pushstring (luaState, "encr_chat"); +// break; +// default: +// assert (0); +// } +//} +// +//void push_user (tgl_peer_t *P) { +// my_lua_checkstack (luaState, 4); +// lua_add_string_field ("first_name", P->user.first_name); +// lua_add_string_field ("last_name", P->user.last_name); +// lua_add_string_field ("real_first_name", P->user.real_first_name); +// lua_add_string_field ("real_last_name", P->user.real_last_name); +// lua_add_string_field ("phone", P->user.phone); +// if (P->user.access_hash) { +// lua_add_num_field ("access_hash", 1); +// } +//} +// +//void push_chat (tgl_peer_t *P) { +// my_lua_checkstack (luaState, 4); +// assert (P->chat.title); +// lua_add_string_field ("title", P->chat.title); +// lua_add_num_field ("members_num", P->chat.users_num); +// if (P->chat.user_list) { +// lua_pushstring (luaState, "members"); +// lua_newtable (luaState); +// int i; +// for (i = 0; i < P->chat.users_num; i++) { +// lua_pushnumber (luaState, i); +// tgl_peer_id_t id = TGL_MK_USER (P->chat.user_list[i].user_id); +// push_peer (id, tgl_peer_get (TLS, id)); +// lua_settable (luaState, -3); +// } +// lua_settable (luaState, -3); +// } +//} +// +//void push_encr_chat (tgl_peer_t *P) { +// my_lua_checkstack (luaState, 4); +// lua_pushstring (luaState, "user"); +// push_peer (TGL_MK_USER (P->encr_chat.user_id), tgl_peer_get (TLS, TGL_MK_USER (P->encr_chat.user_id))); +// lua_settable (luaState, -3); +//} +// +//void push_update_types (unsigned flags) { +// my_lua_checkstack (luaState, 4); +// lua_newtable (luaState); +// int cc = 0; +// +// +// if (flags & TGL_UPDATE_CREATED) { +// lua_add_string_field_arr (cc++, "created"); +// } +// if (flags & TGL_UPDATE_DELETED) { +// lua_add_string_field_arr (cc++, "deleted"); +// } +// if (flags & TGL_UPDATE_PHONE) { +// lua_add_string_field_arr (cc++, "phone"); +// } +// if (flags & TGL_UPDATE_CONTACT) { +// lua_add_string_field_arr (cc++, "contact"); +// } +// if (flags & TGL_UPDATE_PHOTO) { +// lua_add_string_field_arr (cc++, "photo"); +// } +// if (flags & TGL_UPDATE_BLOCKED) { +// lua_add_string_field_arr (cc++, "blocked"); +// } +// if (flags & TGL_UPDATE_REAL_NAME) { +// lua_add_string_field_arr (cc++, "real_name"); +// } +// if (flags & TGL_UPDATE_NAME) { +// lua_add_string_field_arr (cc++, "name"); +// } +// if (flags & TGL_UPDATE_REQUESTED) { +// lua_add_string_field_arr (cc++, "requested"); +// } +// if (flags & TGL_UPDATE_WORKING) { +// lua_add_string_field_arr (cc++, "working"); +// } +// if (flags & TGL_UPDATE_FLAGS) { +// lua_add_string_field_arr (cc++, "flags"); +// } +// if (flags & TGL_UPDATE_TITLE) { +// lua_add_string_field_arr (cc++, "title"); +// } +// if (flags & TGL_UPDATE_ADMIN) { +// lua_add_string_field_arr (cc++, "admin"); +// } +// if (flags & TGL_UPDATE_MEMBERS) { +// lua_add_string_field_arr (cc++, "members"); +// } +// if (flags & TGL_UPDATE_ACCESS_HASH) { +// lua_add_string_field_arr (cc++, "access_hash"); +// } +// if (flags & TGL_UPDATE_USERNAME) { +// lua_add_string_field_arr (cc++, "username"); +// } +// +//} +// +//void push_peer (tgl_peer_id_t id, tgl_peer_t *P) { +// lua_newtable (luaState); +// +// lua_add_num_field ("id", tgl_get_peer_id (id)); +// lua_pushstring (luaState, "type"); +// push_tgl_peer_type (tgl_get_peer_type (id)); +// lua_settable (luaState, -3); +// +// +// if (!P || !(P->flags & FLAG_CREATED)) { +// lua_pushstring (luaState, "print_name"); +// static char s[100]; +// switch (tgl_get_peer_type (id)) { +// case TGL_PEER_USER: +// sprintf (s, "user#%d", tgl_get_peer_id (id)); +// break; +// case TGL_PEER_CHAT: +// sprintf (s, "chat#%d", tgl_get_peer_id (id)); +// break; +// case TGL_PEER_ENCR_CHAT: +// sprintf (s, "encr_chat#%d", tgl_get_peer_id (id)); +// break; +// default: +// assert (0); +// } +// lua_pushstring (luaState, s); +// lua_settable (luaState, -3); // flags +// +// return; +// } +// +// lua_add_string_field ("print_name", P->print_name); +// lua_add_num_field ("flags", P->flags); +// +// switch (tgl_get_peer_type (id)) { +// case TGL_PEER_USER: +// push_user (P); +// break; +// case TGL_PEER_CHAT: +// push_chat (P); +// break; +// case TGL_PEER_ENCR_CHAT: +// push_encr_chat (P); +// break; +// default: +// assert (0); +// } +//} +// +//void push_media (struct tgl_message_media *M) { +// my_lua_checkstack (luaState, 4); +// +// switch (M->type) { +// case tgl_message_media_photo: +// case tgl_message_media_photo_encr: +// lua_newtable (luaState); +// lua_add_string_field ("type", "photo"); +// break; +// /*case tgl_message_media_video: +// case tgl_message_media_video_encr: +// lua_newtable (luaState); +// lua_add_string_field ("type", "video"); +// break; +// case tgl_message_media_audio: +// case tgl_message_media_audio_encr: +// lua_newtable (luaState); +// lua_add_string_field ("type", "audio"); +// break;*/ +// case tgl_message_media_document: +// case tgl_message_media_document_encr: +// lua_newtable (luaState); +// lua_add_string_field ("type", "document"); +// break; +// case tgl_message_media_unsupported: +// lua_newtable (luaState); +// lua_add_string_field ("type", "unsupported"); +// break; +// case tgl_message_media_geo: +// lua_newtable (luaState); +// lua_add_string_field ("type", "geo"); +// lua_add_num_field ("longitude", M->geo.longitude); +// lua_add_num_field ("latitude", M->geo.latitude); +// break; +// case tgl_message_media_contact: +// lua_newtable (luaState); +// lua_add_string_field ("type", "contact"); +// lua_add_string_field ("phone", M->phone); +// lua_add_string_field ("first_name", M->first_name); +// lua_add_string_field ("last_name", M->last_name); +// lua_add_num_field ("user_id", M->user_id); +// break; +// default: +// lua_pushstring (luaState, "???"); +// } +//} +// +//void push_message (struct tgl_message *M) { +// assert (M); +// my_lua_checkstack (luaState, 10); +// lua_newtable (luaState); +// +// static char s[30]; +// snprintf (s, 30, "%lld", M->id); +// lua_add_string_field ("id", s); +// if (!(M->flags & FLAG_CREATED)) { return; } +// lua_add_num_field ("flags", M->flags); +// +// if (tgl_get_peer_type (M->fwd_from_id)) { +// lua_pushstring (luaState, "fwd_from"); +// push_peer (M->fwd_from_id, tgl_peer_get (TLS, M->fwd_from_id)); +// lua_settable (luaState, -3); // fwd_from +// +// lua_add_num_field ("fwd_date", M->fwd_date); +// } +// +// lua_pushstring (luaState, "from"); +// push_peer (M->from_id, tgl_peer_get (TLS, M->from_id)); +// lua_settable (luaState, -3); +// +// lua_pushstring (luaState, "to"); +// push_peer (M->to_id, tgl_peer_get (TLS, M->to_id)); +// lua_settable (luaState, -3); +// +// lua_pushstring (luaState, "out"); +// lua_pushboolean (luaState, M->out); +// lua_settable (luaState, -3); +// +// lua_pushstring (luaState, "unread"); +// lua_pushboolean (luaState, M->unread); +// lua_settable (luaState, -3); +// +// lua_pushstring (luaState, "date"); +// lua_pushnumber (luaState, M->date); +// lua_settable (luaState, -3); +// +// lua_pushstring (luaState, "service"); +// lua_pushboolean (luaState, M->service); +// lua_settable (luaState, -3); +// +// if (!M->service) { +// if (M->message_len && M->message) { +// lua_pushstring (luaState, "text"); +// lua_pushlstring (luaState, M->message, M->message_len); +// lua_settable (luaState, -3); +// } +// if (M->media.type && M->media.type != tgl_message_media_none) { +// lua_pushstring (luaState, "media"); +// push_media (&M->media); +// lua_settable (luaState, -3); +// } +// } +//} +// +//void lua_binlog_end (void) { +// if (!have_file) { return; } +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// lua_getglobal (luaState, "on_binlog_replay_end"); +// assert (lua_gettop (luaState) == 1); +// +// int r = lua_pcall (luaState, 0, 0, 0); +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +//} +// +//void lua_diff_end (void) { +// if (!have_file) { return; } +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// lua_getglobal (luaState, "on_get_difference_end"); +// assert (lua_gettop (luaState) == 1); +// +// int r = lua_pcall (luaState, 0, 0, 0); +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +//} +// +void py_our_id (int id) { +// if (!have_file) { return; } +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// lua_getglobal (luaState, "on_our_id"); +// lua_pushnumber (luaState, id); +// assert (lua_gettop (luaState) == 2); +// +// int r = lua_pcall (luaState, 1, 0, 0); +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } } -void lua_add_string_field_arr (int num, const char *value) { - if (!value || !strlen (value)) { return; } - my_lua_checkstack (luaState, 3); - lua_pushnumber (luaState, num); - lua_pushstring (luaState, value); - lua_settable (luaState, -3); +void py_new_msg (struct tgl_message *M) { +// if (!have_file) { return; } +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// lua_getglobal (luaState, "on_msg_receive"); +// push_message (M); +// assert (lua_gettop (luaState) == 2); +// +// int r = lua_pcall (luaState, 1, 0, 0); +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } } -void lua_add_num_field (const char *name, double value) { - assert (name && strlen (name)); - my_lua_checkstack (luaState, 3); - lua_pushstring (luaState, name); - lua_pushnumber (luaState, value); - lua_settable (luaState, -3); +void py_secret_chat_update (struct tgl_secret_chat *C, unsigned flags) { +// if (!have_file) { return; } +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// lua_getglobal (luaState, "on_secret_chat_update"); +// push_peer (C->id, (void *)C); +// push_update_types (flags); +// assert (lua_gettop (luaState) == 3); +// +// int r = lua_pcall (luaState, 2, 0, 0); +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } } -void push_tgl_peer_type (int x) { - switch (x) { - case TGL_PEER_USER: - lua_pushstring (luaState, "user"); - break; - case TGL_PEER_CHAT: - lua_pushstring (luaState, "chat"); - break; - case TGL_PEER_ENCR_CHAT: - lua_pushstring (luaState, "encr_chat"); - break; - default: - assert (0); - } +void py_user_update (struct tgl_user *U, unsigned flags) { +// if (!have_file) { return; } +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// lua_getglobal (luaState, "on_user_update"); +// push_peer (U->id, (void *)U); +// push_update_types (flags); +// assert (lua_gettop (luaState) == 3); +// +// int r = lua_pcall (luaState, 2, 0, 0); +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } } -void push_user (tgl_peer_t *P) { - my_lua_checkstack (luaState, 4); - lua_add_string_field ("first_name", P->user.first_name); - lua_add_string_field ("last_name", P->user.last_name); - lua_add_string_field ("real_first_name", P->user.real_first_name); - lua_add_string_field ("real_last_name", P->user.real_last_name); - lua_add_string_field ("phone", P->user.phone); - if (P->user.access_hash) { - lua_add_num_field ("access_hash", 1); - } +void py_chat_update (struct tgl_chat *C, unsigned flags) { +// if (!have_file) { return; } +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// lua_getglobal (luaState, "on_chat_update"); +// push_peer (C->id, (void *)C); +// push_update_types (flags); +// assert (lua_gettop (luaState) == 3); +// +// int r = lua_pcall (luaState, 2, 0, 0); +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } } - -void push_chat (tgl_peer_t *P) { - my_lua_checkstack (luaState, 4); - assert (P->chat.title); - lua_add_string_field ("title", P->chat.title); - lua_add_num_field ("members_num", P->chat.users_num); - if (P->chat.user_list) { - lua_pushstring (luaState, "members"); - lua_newtable (luaState); - int i; - for (i = 0; i < P->chat.users_num; i++) { - lua_pushnumber (luaState, i); - tgl_peer_id_t id = TGL_MK_USER (P->chat.user_list[i].user_id); - push_peer (id, tgl_peer_get (TLS, id)); - lua_settable (luaState, -3); - } - lua_settable (luaState, -3); - } -} - -void push_encr_chat (tgl_peer_t *P) { - my_lua_checkstack (luaState, 4); - lua_pushstring (luaState, "user"); - push_peer (TGL_MK_USER (P->encr_chat.user_id), tgl_peer_get (TLS, TGL_MK_USER (P->encr_chat.user_id))); - lua_settable (luaState, -3); -} - -void push_update_types (unsigned flags) { - my_lua_checkstack (luaState, 4); - lua_newtable (luaState); - int cc = 0; - - - if (flags & TGL_UPDATE_CREATED) { - lua_add_string_field_arr (cc++, "created"); - } - if (flags & TGL_UPDATE_DELETED) { - lua_add_string_field_arr (cc++, "deleted"); - } - if (flags & TGL_UPDATE_PHONE) { - lua_add_string_field_arr (cc++, "phone"); - } - if (flags & TGL_UPDATE_CONTACT) { - lua_add_string_field_arr (cc++, "contact"); - } - if (flags & TGL_UPDATE_PHOTO) { - lua_add_string_field_arr (cc++, "photo"); - } - if (flags & TGL_UPDATE_BLOCKED) { - lua_add_string_field_arr (cc++, "blocked"); - } - if (flags & TGL_UPDATE_REAL_NAME) { - lua_add_string_field_arr (cc++, "real_name"); - } - if (flags & TGL_UPDATE_NAME) { - lua_add_string_field_arr (cc++, "name"); - } - if (flags & TGL_UPDATE_REQUESTED) { - lua_add_string_field_arr (cc++, "requested"); - } - if (flags & TGL_UPDATE_WORKING) { - lua_add_string_field_arr (cc++, "working"); - } - if (flags & TGL_UPDATE_FLAGS) { - lua_add_string_field_arr (cc++, "flags"); - } - if (flags & TGL_UPDATE_TITLE) { - lua_add_string_field_arr (cc++, "title"); - } - if (flags & TGL_UPDATE_ADMIN) { - lua_add_string_field_arr (cc++, "admin"); - } - if (flags & TGL_UPDATE_MEMBERS) { - lua_add_string_field_arr (cc++, "members"); - } - if (flags & TGL_UPDATE_ACCESS_HASH) { - lua_add_string_field_arr (cc++, "access_hash"); - } - if (flags & TGL_UPDATE_USERNAME) { - lua_add_string_field_arr (cc++, "username"); - } - -} - -void push_peer (tgl_peer_id_t id, tgl_peer_t *P) { - lua_newtable (luaState); - - lua_add_num_field ("id", tgl_get_peer_id (id)); - lua_pushstring (luaState, "type"); - push_tgl_peer_type (tgl_get_peer_type (id)); - lua_settable (luaState, -3); - - - if (!P || !(P->flags & FLAG_CREATED)) { - lua_pushstring (luaState, "print_name"); - static char s[100]; - switch (tgl_get_peer_type (id)) { - case TGL_PEER_USER: - sprintf (s, "user#%d", tgl_get_peer_id (id)); - break; - case TGL_PEER_CHAT: - sprintf (s, "chat#%d", tgl_get_peer_id (id)); - break; - case TGL_PEER_ENCR_CHAT: - sprintf (s, "encr_chat#%d", tgl_get_peer_id (id)); - break; - default: - assert (0); - } - lua_pushstring (luaState, s); - lua_settable (luaState, -3); // flags - - return; - } - - lua_add_string_field ("print_name", P->print_name); - lua_add_num_field ("flags", P->flags); - - switch (tgl_get_peer_type (id)) { - case TGL_PEER_USER: - push_user (P); - break; - case TGL_PEER_CHAT: - push_chat (P); - break; - case TGL_PEER_ENCR_CHAT: - push_encr_chat (P); - break; - default: - assert (0); - } -} - -void push_media (struct tgl_message_media *M) { - my_lua_checkstack (luaState, 4); - - switch (M->type) { - case tgl_message_media_photo: - case tgl_message_media_photo_encr: - lua_newtable (luaState); - lua_add_string_field ("type", "photo"); - break; - /*case tgl_message_media_video: - case tgl_message_media_video_encr: - lua_newtable (luaState); - lua_add_string_field ("type", "video"); - break; - case tgl_message_media_audio: - case tgl_message_media_audio_encr: - lua_newtable (luaState); - lua_add_string_field ("type", "audio"); - break;*/ - case tgl_message_media_document: - case tgl_message_media_document_encr: - lua_newtable (luaState); - lua_add_string_field ("type", "document"); - break; - case tgl_message_media_unsupported: - lua_newtable (luaState); - lua_add_string_field ("type", "unsupported"); - break; - case tgl_message_media_geo: - lua_newtable (luaState); - lua_add_string_field ("type", "geo"); - lua_add_num_field ("longitude", M->geo.longitude); - lua_add_num_field ("latitude", M->geo.latitude); - break; - case tgl_message_media_contact: - lua_newtable (luaState); - lua_add_string_field ("type", "contact"); - lua_add_string_field ("phone", M->phone); - lua_add_string_field ("first_name", M->first_name); - lua_add_string_field ("last_name", M->last_name); - lua_add_num_field ("user_id", M->user_id); - break; - default: - lua_pushstring (luaState, "???"); - } -} - -void push_message (struct tgl_message *M) { - assert (M); - my_lua_checkstack (luaState, 10); - lua_newtable (luaState); - - static char s[30]; - snprintf (s, 30, "%lld", M->id); - lua_add_string_field ("id", s); - if (!(M->flags & FLAG_CREATED)) { return; } - lua_add_num_field ("flags", M->flags); - - if (tgl_get_peer_type (M->fwd_from_id)) { - lua_pushstring (luaState, "fwd_from"); - push_peer (M->fwd_from_id, tgl_peer_get (TLS, M->fwd_from_id)); - lua_settable (luaState, -3); // fwd_from - - lua_add_num_field ("fwd_date", M->fwd_date); - } - - lua_pushstring (luaState, "from"); - push_peer (M->from_id, tgl_peer_get (TLS, M->from_id)); - lua_settable (luaState, -3); - - lua_pushstring (luaState, "to"); - push_peer (M->to_id, tgl_peer_get (TLS, M->to_id)); - lua_settable (luaState, -3); - - lua_pushstring (luaState, "out"); - lua_pushboolean (luaState, M->out); - lua_settable (luaState, -3); - - lua_pushstring (luaState, "unread"); - lua_pushboolean (luaState, M->unread); - lua_settable (luaState, -3); - - lua_pushstring (luaState, "date"); - lua_pushnumber (luaState, M->date); - lua_settable (luaState, -3); - - lua_pushstring (luaState, "service"); - lua_pushboolean (luaState, M->service); - lua_settable (luaState, -3); - - if (!M->service) { - if (M->message_len && M->message) { - lua_pushstring (luaState, "text"); - lua_pushlstring (luaState, M->message, M->message_len); - lua_settable (luaState, -3); - } - if (M->media.type && M->media.type != tgl_message_media_none) { - lua_pushstring (luaState, "media"); - push_media (&M->media); - lua_settable (luaState, -3); - } - } -} - -void lua_binlog_end (void) { - if (!have_file) { return; } - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - lua_getglobal (luaState, "on_binlog_replay_end"); - assert (lua_gettop (luaState) == 1); - - int r = lua_pcall (luaState, 0, 0, 0); - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } -} - -void lua_diff_end (void) { - if (!have_file) { return; } - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - lua_getglobal (luaState, "on_get_difference_end"); - assert (lua_gettop (luaState) == 1); - - int r = lua_pcall (luaState, 0, 0, 0); - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } -} - -void lua_our_id (int id) { - if (!have_file) { return; } - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - lua_getglobal (luaState, "on_our_id"); - lua_pushnumber (luaState, id); - assert (lua_gettop (luaState) == 2); - - int r = lua_pcall (luaState, 1, 0, 0); - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } -} - -void lua_new_msg (struct tgl_message *M) { - if (!have_file) { return; } - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - lua_getglobal (luaState, "on_msg_receive"); - push_message (M); - assert (lua_gettop (luaState) == 2); - - int r = lua_pcall (luaState, 1, 0, 0); - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } -} - -void lua_secret_chat_update (struct tgl_secret_chat *C, unsigned flags) { - if (!have_file) { return; } - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - lua_getglobal (luaState, "on_secret_chat_update"); - push_peer (C->id, (void *)C); - push_update_types (flags); - assert (lua_gettop (luaState) == 3); - - int r = lua_pcall (luaState, 2, 0, 0); - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } -} - -void lua_user_update (struct tgl_user *U, unsigned flags) { - if (!have_file) { return; } - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - lua_getglobal (luaState, "on_user_update"); - push_peer (U->id, (void *)U); - push_update_types (flags); - assert (lua_gettop (luaState) == 3); - - int r = lua_pcall (luaState, 2, 0, 0); - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } -} - -void lua_chat_update (struct tgl_chat *C, unsigned flags) { - if (!have_file) { return; } - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - lua_getglobal (luaState, "on_chat_update"); - push_peer (C->id, (void *)C); - push_update_types (flags); - assert (lua_gettop (luaState) == 3); - - int r = lua_pcall (luaState, 2, 0, 0); - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } -} - -//extern tgl_peer_t *Peers[]; -//extern int peer_num; - -#define MAX_LUA_COMMANDS 1000 -void *lua_ptr[MAX_LUA_COMMANDS]; -static int pos; - -static inline tgl_peer_t *get_peer (const char *s) { - return tgl_peer_get_by_name (TLS, s); -} - -enum lua_query_type { - lq_contact_list, - lq_dialog_list, - lq_msg, - lq_send_typing, - lq_send_typing_abort, - lq_rename_chat, - lq_send_photo, - lq_chat_set_photo, - lq_set_profile_photo, - lq_set_profile_name, - lq_send_video, - lq_send_text, - lq_fwd, - lq_fwd_media, - lq_load_photo, - lq_load_video_thumb, - lq_load_video, - lq_chat_info, - lq_user_info, - lq_history, - lq_chat_add_user, - lq_chat_del_user, - lq_add_contact, - lq_del_contact, - lq_rename_contact, - lq_search, - lq_global_search, - lq_mark_read, - lq_create_secret_chat, - lq_create_group_chat, - lq_send_audio, - lq_send_document, - lq_send_file, - lq_load_audio, - lq_load_document, - lq_load_document_thumb, - lq_delete_msg, - lq_restore_msg, - lq_accept_secret_chat, - lq_send_contact, - lq_status_online, - lq_status_offline, - lq_send_location, - lq_extf -}; - -struct lua_query_extra { - int func; - int param; -}; - -void lua_empty_cb (struct tgl_state *TLSR, void *cb_extra, int success) { - assert (TLSR == TLS); - struct lua_query_extra *cb = cb_extra; - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); - - lua_pushnumber (luaState, success); - - assert (lua_gettop (luaState) == 3); - - int r = lua_pcall (luaState, 2, 0, 0); - - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); - - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } - - free (cb); -} - -void lua_contact_list_cb (struct tgl_state *TLSR, void *cb_extra, int success, int num, struct tgl_user **UL) { - assert (TLSR == TLS); - struct lua_query_extra *cb = cb_extra; - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); - - lua_pushnumber (luaState, success); - - if (success) { - lua_newtable (luaState); - int i; - for (i = 0; i < num; i++) { - lua_pushnumber (luaState, i); - push_peer (UL[i]->id, (void *)UL[i]); - lua_settable (luaState, -3); - } - } else { - lua_pushboolean (luaState, 0); - } - - assert (lua_gettop (luaState) == 4); - - int r = lua_pcall (luaState, 3, 0, 0); - - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); - - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } - - free (cb); -} - -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[]) { - assert (TLSR == TLS); - struct lua_query_extra *cb = cb_extra; - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); - - lua_pushnumber (luaState, success); - if (success) { - lua_newtable (luaState); - int i; - for (i = 0; i < num; i++) { - lua_pushnumber (luaState, i); - - lua_newtable (luaState); - - lua_pushstring (luaState, "peer"); - push_peer (peers[i], tgl_peer_get (TLS, peers[i])); - lua_settable (luaState, -3); - - struct tgl_message *M = tgl_message_get (TLS, msgs[i]); - if (M && (M->flags & FLAG_CREATED)) { - lua_pushstring (luaState, "message"); - push_message (M); - lua_settable (luaState, -3); - } - - lua_pushstring (luaState, "unread"); - lua_pushnumber (luaState, unread[i]); - lua_settable (luaState, -3); - - lua_settable (luaState, -3); - } - } else { - lua_pushboolean (luaState, 0); - } - assert (lua_gettop (luaState) == 4); - - - int r = lua_pcall (luaState, 3, 0, 0); - - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); - - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } - - free (cb); -} - -void lua_msg_cb (struct tgl_state *TLSR, void *cb_extra, int success, struct tgl_message *M) { - assert (TLSR == TLS); - struct lua_query_extra *cb = cb_extra; - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); - - lua_pushnumber (luaState, success); - - if (success) { - push_message (M); - } else { - lua_pushboolean (luaState, 0); - } - - assert (lua_gettop (luaState) == 4); - - int r = lua_pcall (luaState, 3, 0, 0); - - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); - - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } - - free (cb); -} - -void lua_msg_list_cb (struct tgl_state *TLSR, void *cb_extra, int success, int num, struct tgl_message *M[]) { - assert (TLSR == TLS); - struct lua_query_extra *cb = cb_extra; - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); - - lua_pushnumber (luaState, success); - - if (success) { - lua_newtable (luaState); - int i; - for (i = 0; i < num; i++) { - lua_pushnumber (luaState, i); - push_message (M[i]); - lua_settable (luaState, -3); - } - } else { - lua_pushboolean (luaState, 0); - } - - assert (lua_gettop (luaState) == 4); - - int r = lua_pcall (luaState, 3, 0, 0); - - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); - - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } - - free (cb); -} - -void lua_file_cb (struct tgl_state *TLSR, void *cb_extra, int success, char *file_name) { - assert (TLSR == TLS); - struct lua_query_extra *cb = cb_extra; - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); - - lua_pushnumber (luaState, success); - - if (success) { - lua_pushstring (luaState, file_name); - } else { - lua_pushboolean (luaState, 0); - } - - assert (lua_gettop (luaState) == 4); - - int r = lua_pcall (luaState, 3, 0, 0); - - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); - - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } - - free (cb); -} - -void lua_chat_cb (struct tgl_state *TLSR, void *cb_extra, int success, struct tgl_chat *C) { - assert (TLSR == TLS); - struct lua_query_extra *cb = cb_extra; - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); - - lua_pushnumber (luaState, success); - - if (success) { - push_peer (C->id, (void *)C); - } else { - lua_pushboolean (luaState, 0); - } - - assert (lua_gettop (luaState) == 4); - - int r = lua_pcall (luaState, 3, 0, 0); - - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); - - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } - - free (cb); -} - -void lua_secret_chat_cb (struct tgl_state *TLSR, void *cb_extra, int success, struct tgl_secret_chat *C) { - assert (TLSR == TLS); - struct lua_query_extra *cb = cb_extra; - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); - - lua_pushnumber (luaState, success); - - if (success) { - push_peer (C->id, (void *)C); - } else { - lua_pushboolean (luaState, 0); - } - - assert (lua_gettop (luaState) == 4); - - int r = lua_pcall (luaState, 3, 0, 0); - - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); - - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } - - free (cb); -} - -void lua_user_cb (struct tgl_state *TLSR, void *cb_extra, int success, struct tgl_user *C) { - assert (TLSR == TLS); - struct lua_query_extra *cb = cb_extra; - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); - - lua_pushnumber (luaState, success); - - if (success) { - push_peer (C->id, (void *)C); - } else { - lua_pushboolean (luaState, 0); - } - - assert (lua_gettop (luaState) == 4); - - int r = lua_pcall (luaState, 3, 0, 0); - - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); - - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } - - free (cb); -} - -void lua_str_cb (struct tgl_state *TLSR, void *cb_extra, int success, char *data) { - assert (TLSR == TLS); - struct lua_query_extra *cb = cb_extra; - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); - lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); - - lua_pushnumber (luaState, success); - - if (success) { - lua_pushstring (luaState, data); - } else { - lua_pushboolean (luaState, 0); - } - - assert (lua_gettop (luaState) == 4); - - int r = lua_pcall (luaState, 3, 0, 0); - - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); - luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); - - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } - - free (cb); -} - -void lua_do_all (void) { - int p = 0; - while (p < pos) { - int l = (long)lua_ptr[p ++]; - assert (p + l + 1 <= pos); - enum lua_query_type f = (long)lua_ptr[p ++]; - struct tgl_message *M; - char *s, *s1, *s2, *s3; - switch (f) { - case lq_contact_list: - tgl_do_update_contact_list (TLS, lua_contact_list_cb, lua_ptr[p ++]); - break; - case lq_dialog_list: - tgl_do_get_dialog_list (TLS, lua_dialog_list_cb, lua_ptr[p ++]); - break; - case lq_msg: - tgl_do_send_message (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], strlen (lua_ptr[p + 2]), lua_msg_cb, lua_ptr[p]); - free (lua_ptr[p + 2]); - p += 3; - break; - case lq_send_typing: - tgl_do_send_typing (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, tgl_typing_typing, lua_empty_cb, lua_ptr[p]); - p += 2; - break; - case lq_send_typing_abort: - tgl_do_send_typing (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, tgl_typing_cancel, lua_empty_cb, lua_ptr[p]); - p += 2; - break; - case lq_rename_chat: - tgl_do_rename_chat (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); - free (lua_ptr[p + 2]); - p += 3; - break; - case lq_send_photo: - tgl_do_send_document (TLS, -1, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); - free (lua_ptr[p + 2]); - p += 3; - break; - case lq_send_video: - tgl_do_send_document (TLS, FLAG_DOCUMENT_VIDEO, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); - free (lua_ptr[p + 2]); - p += 3; - break; - case lq_send_audio: - tgl_do_send_document (TLS, FLAG_DOCUMENT_AUDIO, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); - free (lua_ptr[p + 2]); - p += 3; - break; - case lq_send_document: - tgl_do_send_document (TLS, 0, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); - free (lua_ptr[p + 2]); - p += 3; - break; - case lq_send_file: - tgl_do_send_document (TLS, -2, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); - free (lua_ptr[p + 2]); - p += 3; - break; - case lq_send_text: - tgl_do_send_text (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); - free (lua_ptr[p + 2]); - p += 3; - break; - case lq_chat_set_photo: - tgl_do_set_chat_photo (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); - free (lua_ptr[p + 2]); - p += 3; - break; - case lq_load_photo: - case lq_load_video: - case lq_load_audio: - case lq_load_document: - M = lua_ptr[p + 1]; - if (!M || (M->media.type != tgl_message_media_photo && M->media.type != tgl_message_media_photo_encr && M->media.type != tgl_message_media_document && M->media.type != tgl_message_media_document_encr)) { - lua_file_cb (TLS, lua_ptr[p], 0, 0); - } else { - if (M->media.type == tgl_message_media_photo) { - tgl_do_load_photo (TLS, &M->media.photo, lua_file_cb, lua_ptr[p]); - } else if (M->media.type == tgl_message_media_document) { - tgl_do_load_document (TLS, &M->media.document, lua_file_cb, lua_ptr[p]); - } else { - tgl_do_load_encr_document (TLS, &M->media.encr_document, lua_file_cb, lua_ptr[p]); - } - } - p += 2; - break; - case lq_load_video_thumb: - case lq_load_document_thumb: - M = lua_ptr[p + 1]; - if (!M || (M->media.type != tgl_message_media_document)) { - lua_file_cb (TLS, lua_ptr[p], 0, 0); - } else { - tgl_do_load_document_thumb (TLS, &M->media.document, lua_file_cb, lua_ptr[p]); - } - p += 2; - break; - case lq_fwd: - tgl_do_forward_message (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, ((struct tgl_message *)lua_ptr[p + 2])->id, lua_msg_cb, lua_ptr[p]); - p += 3; - break; - case lq_fwd_media: - tgl_do_forward_media (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, ((struct tgl_message *)lua_ptr[p + 2])->id, lua_msg_cb, lua_ptr[p]); - p += 3; - break; - case lq_chat_info: - tgl_do_get_chat_info (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, 0, lua_chat_cb, lua_ptr[p]); - p += 2; - break; - case lq_user_info: - tgl_do_get_user_info (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, 0, lua_user_cb, lua_ptr[p]); - p += 2; - break; - case lq_history: - tgl_do_get_history (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, (long)lua_ptr[p + 2], 0, lua_msg_list_cb, lua_ptr[p]); - p += 3; - break; - case lq_chat_add_user: - tgl_do_add_user_to_chat (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, ((tgl_peer_t *)lua_ptr[p + 2])->id, 10, lua_msg_cb, lua_ptr[p]); - p += 3; - break; - case lq_chat_del_user: - tgl_do_del_user_from_chat (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, ((tgl_peer_t *)lua_ptr[p + 2])->id, lua_msg_cb, lua_ptr[p]); - p += 3; - break; - case lq_add_contact: - s1 = lua_ptr[p + 1]; - s2 = lua_ptr[p + 2]; - s3 = lua_ptr[p + 3]; - tgl_do_add_contact (TLS, s1, strlen (s1), s2, strlen (s2), s3, strlen (s3), 0, lua_contact_list_cb, lua_ptr[p]); - free (s1); - free (s2); - free (s3); - p += 4; - break; - case lq_del_contact: - tgl_do_del_contact (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_empty_cb, lua_ptr[p]); - p += 2; - break; - case lq_rename_contact: - s1 = lua_ptr[p + 1]; - s2 = lua_ptr[p + 2]; - s3 = lua_ptr[p + 3]; - tgl_do_add_contact (TLS, s1, strlen (s1), s2, strlen (s2), s3, strlen (s3), 1, lua_contact_list_cb, lua_ptr[p]); - free (s1); - free (s2); - free (s3); - p += 4; - break; - case lq_search: - s = lua_ptr[p + 2]; - tgl_do_msg_search (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, 0, 0, 40, 0, s, lua_msg_list_cb, lua_ptr[p]); - free (s); - p += 3; - break; - case lq_global_search: - s = lua_ptr[p + 1]; - tgl_do_msg_search (TLS, tgl_set_peer_id (TGL_PEER_UNKNOWN, 0), 0, 0, 40, 0, s, lua_msg_list_cb, lua_ptr[p]); - free (s); - p += 2; - break; - case lq_mark_read: - tgl_do_mark_read (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_empty_cb, lua_ptr[p]); - p += 2; - break; - case lq_set_profile_photo: - s = lua_ptr[p + 1]; - tgl_do_set_profile_photo (TLS, s, lua_empty_cb, lua_ptr[p]); - free (s); - p += 2; - break; - case lq_set_profile_name: - s1 = lua_ptr[p + 1]; - s2 = lua_ptr[p + 1]; - tgl_do_set_profile_name (TLS, s1, s2, lua_user_cb, lua_ptr[p]); - free (s1); - free (s2); - p += 3; - break; - case lq_create_secret_chat: - tgl_do_create_secret_chat (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_secret_chat_cb, lua_ptr[p]); - p += 2; - break; - case lq_create_group_chat: - s = lua_ptr[p + 2]; - tgl_do_create_group_chat (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, s, lua_msg_cb, lua_ptr[p]); - free (s); - p += 3; - break; - case lq_delete_msg: - tgl_do_delete_msg (TLS, ((struct tgl_message *)lua_ptr[p + 1])->id, lua_empty_cb, lua_ptr[p]); - p += 2; - break; - case lq_restore_msg: - tgl_do_delete_msg (TLS, (long)lua_ptr[p + 1], lua_empty_cb, lua_ptr[p]); - p += 2; - break; - case lq_accept_secret_chat: - tgl_do_accept_encr_chat_request (TLS, lua_ptr[p + 1], lua_secret_chat_cb, lua_ptr[p]); - p += 2; - break; - case lq_send_contact: - s1 = lua_ptr[p + 2]; - s2 = lua_ptr[p + 3]; - s3 = lua_ptr[p + 4]; - tgl_do_send_contact (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, s1, strlen (s1), s2, strlen (s2), s3, strlen (s3), lua_msg_cb, lua_ptr[p]); - free (s1); - free (s2); - free (s3); - p += 5; - break; - case lq_status_online: - tgl_do_update_status (TLS, 1, lua_empty_cb, lua_ptr[p]); - p ++; - break; - case lq_status_offline: - tgl_do_update_status (TLS, 0, lua_empty_cb, lua_ptr[p]); - p ++; - break; - case lq_extf: - s = lua_ptr[p + 1]; - tgl_do_send_extf (TLS, s, strlen (s), lua_str_cb, lua_ptr[p]); - free (s); - p += 2; - break; - case lq_send_location: - if (sizeof (void *) == 4) { - tgl_do_send_location (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id , *(float *)(lua_ptr + p + 2), *(float *)(lua_ptr + p + 3), lua_msg_cb, lua_ptr[p]); - } else { - tgl_do_send_location (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id , *(double *)(lua_ptr + p + 2), *(double *)(lua_ptr + p + 3), lua_msg_cb, lua_ptr[p]); - } - p += 4; - break; - /* - lq_delete_msg, - lq_restore_msg, - case 0: - tgl_do_send_message (((tgl_peer_t *)lua_ptr[p])->id, lua_ptr[p + 1], strlen (lua_ptr[p + 1]), 0, 0); - free (lua_ptr[p + 1]); - p += 2; - break; - case 1: - tgl_do_forward_message (((tgl_peer_t *)lua_ptr[p])->id, (long)lua_ptr[p + 1], 0, 0); - p += 2; - break; - case 2: - tgl_do_mark_read (((tgl_peer_t *)lua_ptr[p])->id, 0, 0); - p += 1; - break;*/ - default: - assert (0); - } - } - pos = 0; -} - - -enum lua_function_param { - lfp_none, - lfp_peer, - lfp_chat, - lfp_user, - lfp_secret_chat, - lfp_string, - lfp_number, - lfp_positive_number, - lfp_nonnegative_number, - lfp_msg, - lfp_double -}; - -struct lua_function { - char *name; - enum lua_query_type type; - enum lua_function_param params[10]; -}; - -struct lua_function functions[] = { - {"get_contact_list", lq_contact_list, { lfp_none }}, - {"get_dialog_list", lq_dialog_list, { lfp_none }}, - {"rename_chat", lq_rename_chat, { lfp_chat, lfp_string, lfp_none }}, - {"send_msg", lq_msg, { lfp_peer, lfp_string, lfp_none }}, - {"send_typing", lq_send_typing, { lfp_peer, lfp_none }}, - {"send_typing_abort", lq_send_typing_abort, { lfp_peer, lfp_none }}, - {"send_photo", lq_send_photo, { lfp_peer, lfp_string, lfp_none }}, - {"send_video", lq_send_video, { lfp_peer, lfp_string, lfp_none }}, - {"send_audio", lq_send_audio, { lfp_peer, lfp_string, lfp_none }}, - {"send_document", lq_send_document, { lfp_peer, lfp_string, lfp_none }}, - {"send_file", lq_send_file, { lfp_peer, lfp_string, lfp_none }}, - {"send_text", lq_send_text, { lfp_peer, lfp_string, lfp_none }}, - {"chat_set_photo", lq_chat_set_photo, { lfp_chat, lfp_string, lfp_none }}, - {"load_photo", lq_load_photo, { lfp_msg, lfp_none }}, - {"load_video", lq_load_video, { lfp_msg, lfp_none }}, - {"load_video_thumb", lq_load_video_thumb, { lfp_msg, lfp_none }}, - {"load_audio", lq_load_audio, { lfp_msg, lfp_none }}, - {"load_document", lq_load_document, { lfp_msg, lfp_none }}, - {"load_document_thumb", lq_load_document_thumb, { lfp_msg, lfp_none }}, - {"fwd_msg", lq_fwd, { lfp_peer, lfp_msg, lfp_none }}, - {"fwd_media", lq_fwd_media, { lfp_peer, lfp_msg, lfp_none }}, - {"chat_info", lq_chat_info, { lfp_chat, lfp_none }}, - {"user_info", lq_user_info, { lfp_user, lfp_none }}, - {"get_history", lq_history, { lfp_peer, lfp_nonnegative_number, lfp_none }}, - {"chat_add_user", lq_chat_add_user, { lfp_chat, lfp_user, lfp_none }}, - {"chat_del_user", lq_chat_del_user, { lfp_chat, lfp_user, lfp_none }}, - {"add_contact", lq_add_contact, { lfp_string, lfp_string, lfp_string, lfp_none }}, - {"del_contact", lq_del_contact, { lfp_user, lfp_none }}, - {"rename_contact", lq_rename_contact, { lfp_string, lfp_string, lfp_string, lfp_none }}, - {"msg_search", lq_search, { lfp_peer, lfp_string, lfp_none }}, - {"msg_global_search", lq_global_search, { lfp_string, lfp_none }}, - {"mark_read", lq_mark_read, { lfp_peer, lfp_none }}, - {"set_profile_photo", lq_set_profile_photo, { lfp_string, lfp_none }}, - {"set_profile_name", lq_set_profile_name, { lfp_string, lfp_none }}, - {"create_secret_chat", lq_create_secret_chat, { lfp_user, lfp_none }}, - {"create_group_chat", lq_create_group_chat, { lfp_user, lfp_string, lfp_none }}, - {"delete_msg", lq_delete_msg, { lfp_msg, lfp_none }}, - {"restore_msg", lq_restore_msg, { lfp_positive_number, lfp_none }}, - {"accept_secret_chat", lq_accept_secret_chat, { lfp_secret_chat, lfp_none }}, - {"send_contact", lq_send_contact, { lfp_peer, lfp_string, lfp_string, lfp_string, lfp_none }}, - {"status_online", lq_status_online, { lfp_none }}, - {"status_offline", lq_status_offline, { lfp_none }}, - {"send_location", lq_send_location, { lfp_peer, lfp_double, lfp_double, lfp_none }}, - {"ext_function", lq_extf, { lfp_string, lfp_none }}, - { 0, 0, { lfp_none}} -}; - -static int parse_lua_function (lua_State *L, struct lua_function *F) { - int p = 0; - while (F->params[p] != lfp_none) { p ++; } - if (lua_gettop (L) != p + 2) { - lua_pushboolean (L, 0); - return 1; - } - - int a1 = luaL_ref (L, LUA_REGISTRYINDEX); - int a2 = luaL_ref (L, LUA_REGISTRYINDEX); - - struct lua_query_extra *e = malloc (sizeof (*e)); - assert (e); - e->func = a2; - e->param = a1; - - assert (pos + 3 + p < MAX_LUA_COMMANDS); - - lua_ptr[pos ++] = (void *)(long)(p + 1); - lua_ptr[pos ++] = (void *)(long)F->type; - lua_ptr[pos ++] = e; - - int sp = p; - int ok = 1; - int cc = 0; - while (p > 0) { - p --; - cc ++; - const char *s; - tgl_peer_t *P; - long long num; - double dval; - struct tgl_message *M; - switch (F->params[p]) { - case lfp_none: - assert (0); - break; - case lfp_peer: - case lfp_user: - case lfp_chat: - case lfp_secret_chat: - s = lua_tostring (L, -cc); - if (!s) { - ok = 0; - break; - } - if (sscanf (s, "user#id%lld", &num) == 1 && num > 0) { - tgl_insert_empty_user (TLS, num); - P = tgl_peer_get (TLS, TGL_MK_USER (num)); - } else if (sscanf (s, "chat#id%lld", &num) == 1 && num > 0) { - tgl_insert_empty_chat (TLS, num); - P = tgl_peer_get (TLS, TGL_MK_CHAT (num)); - } else { - P = get_peer (s); - } - if (!P/* || !(P->flags & FLAG_CREATED)*/) { - ok = 0; - break; - } - if (F->params[p] != lfp_peer) { - if ((tgl_get_peer_type (P->id) == TGL_PEER_USER && F->params[p] != lfp_user) || - (tgl_get_peer_type (P->id) == TGL_PEER_CHAT && F->params[p] != lfp_chat) || - (tgl_get_peer_type (P->id) == TGL_PEER_ENCR_CHAT && F->params[p] != lfp_secret_chat)) { - ok = 0; - break; - } - } - lua_ptr[pos + p] = P; - break; - - case lfp_string: - s = lua_tostring (L, -cc); - if (!s) { - ok = 0; - break; - } - lua_ptr[pos + p] = (void *)s; - break; - - case lfp_number: - num = lua_tonumber (L, -cc); - - lua_ptr[pos + p] = (void *)(long)num; - break; - - case lfp_double: - dval = lua_tonumber (L, -cc); - - if (sizeof (void *) == 4) { - *(float *)(lua_ptr + pos + p) = dval; - } else { - assert (sizeof (void *) >= 8); - *(double *)(lua_ptr + pos + p) = dval; - } - break; - - case lfp_positive_number: - num = lua_tonumber (L, -cc); - if (num <= 0) { - ok = 0; - break; - } - - lua_ptr[pos + p] = (void *)(long)num; - break; - - case lfp_nonnegative_number: - num = lua_tonumber (L, -cc); - if (num < 0) { - ok = 0; - break; - } - - lua_ptr[pos + p] = (void *)(long)num; - break; - - case lfp_msg: - s = lua_tostring (L, -cc); - if (!s || !strlen (s)) { - ok = 0; - break; - } - - num = atoll (s); - - M = tgl_message_get (TLS, num); - - if (!M || !(M->flags & FLAG_CREATED)) { - ok = 0; - break; - } - - lua_ptr[pos + p] = M; - break; - - default: - assert (0); - } - } - if (!ok) { - luaL_unref (luaState, LUA_REGISTRYINDEX, a1); - luaL_unref (luaState, LUA_REGISTRYINDEX, a2); - free (e); - pos -= 3; - lua_pushboolean (L, 0); - return 1; - } - - for (p = 0; p < sp; p++) { - if (F->params[p] == lfp_string) { - lua_ptr[pos + p] = strdup (lua_ptr[pos + p]); - } - } - pos += p; - - lua_pushboolean (L, 1); - return 1; -} - - -static void lua_postpone_alarm (evutil_socket_t fd, short what, void *arg) { - int *t = arg; - - lua_settop (luaState, 0); - //lua_checkstack (luaState, 20); - my_lua_checkstack (luaState, 20); - - lua_rawgeti (luaState, LUA_REGISTRYINDEX, t[1]); - lua_rawgeti (luaState, LUA_REGISTRYINDEX, t[0]); - assert (lua_gettop (luaState) == 2); - - int r = lua_pcall (luaState, 1, 0, 0); - - luaL_unref (luaState, LUA_REGISTRYINDEX, t[0]); - luaL_unref (luaState, LUA_REGISTRYINDEX, t[1]); - - if (r) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - } - -} - -static int postpone_from_lua (lua_State *L) { - int n = lua_gettop (L); - if (n != 3) { - lua_pushboolean (L, 0); - return 1; - } - - double timeout = lua_tonumber (L, -1); - if (timeout < 0) { - lua_pushboolean (L, 0); - return 1; - } - - lua_pop (L, 1); - int a1 = luaL_ref (L, LUA_REGISTRYINDEX); - int a2 = luaL_ref (L, LUA_REGISTRYINDEX); - - - int *t = malloc (16); - assert (t); - struct event *ev = evtimer_new (TLS->ev_base, lua_postpone_alarm, t); - t[0] = a1; - t[1] = a2; - *(void **)(t + 2) = ev; - - struct timeval ts= { - .tv_sec = (long)timeout, - .tv_usec = (timeout - ((long)timeout)) * 1000000 - }; - event_add (ev, &ts); - - lua_pushboolean (L, 1); - return 1; -} - -extern int safe_quit; -static int safe_quit_from_lua (lua_State *L) { - int n = lua_gettop (L); - if (n != 0) { - lua_pushboolean (L, 0); - return 1; - } - safe_quit = 1; - - lua_pushboolean (L, 1); - return 1; -} - -static int universal_from_lua (lua_State *L) { - const char *s = lua_tostring(L, lua_upvalueindex(1)); - if (!s) { - lua_pushboolean (L, 0); - return 1; - } - int i = 0; - while (functions[i].name) { - if (!strcmp (functions[i].name, s)) { - return parse_lua_function (L, &functions[i]); - } - i ++; - } - lua_pushboolean (L, 0); - return 1; -} - - -static void my_python_register (const char *name, lua_CFunction f) { - lua_pushstring(L, name); - lua_pushcclosure(L, f, 1); - lua_setglobal(L, name); -} - - +// +////extern tgl_peer_t *Peers[]; +////extern int peer_num; +// +//#define MAX_LUA_COMMANDS 1000 +//void *lua_ptr[MAX_LUA_COMMANDS]; +//static int pos; +// +//static inline tgl_peer_t *get_peer (const char *s) { +// return tgl_peer_get_by_name (TLS, s); +//} +// +//enum lua_query_type { +// lq_contact_list, +// lq_dialog_list, +// lq_msg, +// lq_send_typing, +// lq_send_typing_abort, +// lq_rename_chat, +// lq_send_photo, +// lq_chat_set_photo, +// lq_set_profile_photo, +// lq_set_profile_name, +// lq_send_video, +// lq_send_text, +// lq_fwd, +// lq_fwd_media, +// lq_load_photo, +// lq_load_video_thumb, +// lq_load_video, +// lq_chat_info, +// lq_user_info, +// lq_history, +// lq_chat_add_user, +// lq_chat_del_user, +// lq_add_contact, +// lq_del_contact, +// lq_rename_contact, +// lq_search, +// lq_global_search, +// lq_mark_read, +// lq_create_secret_chat, +// lq_create_group_chat, +// lq_send_audio, +// lq_send_document, +// lq_send_file, +// lq_load_audio, +// lq_load_document, +// lq_load_document_thumb, +// lq_delete_msg, +// lq_restore_msg, +// lq_accept_secret_chat, +// lq_send_contact, +// lq_status_online, +// lq_status_offline, +// lq_send_location, +// lq_extf +//}; +// +//struct lua_query_extra { +// int func; +// int param; +//}; +// +//void lua_empty_cb (struct tgl_state *TLSR, void *cb_extra, int success) { +// assert (TLSR == TLS); +// struct lua_query_extra *cb = cb_extra; +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); +// +// lua_pushnumber (luaState, success); +// +// assert (lua_gettop (luaState) == 3); +// +// int r = lua_pcall (luaState, 2, 0, 0); +// +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); +// +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +// +// free (cb); +//} +// +//void lua_contact_list_cb (struct tgl_state *TLSR, void *cb_extra, int success, int num, struct tgl_user **UL) { +// assert (TLSR == TLS); +// struct lua_query_extra *cb = cb_extra; +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); +// +// lua_pushnumber (luaState, success); +// +// if (success) { +// lua_newtable (luaState); +// int i; +// for (i = 0; i < num; i++) { +// lua_pushnumber (luaState, i); +// push_peer (UL[i]->id, (void *)UL[i]); +// lua_settable (luaState, -3); +// } +// } else { +// lua_pushboolean (luaState, 0); +// } +// +// assert (lua_gettop (luaState) == 4); +// +// int r = lua_pcall (luaState, 3, 0, 0); +// +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); +// +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +// +// free (cb); +//} +// +//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[]) { +// assert (TLSR == TLS); +// struct lua_query_extra *cb = cb_extra; +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); +// +// lua_pushnumber (luaState, success); +// if (success) { +// lua_newtable (luaState); +// int i; +// for (i = 0; i < num; i++) { +// lua_pushnumber (luaState, i); +// +// lua_newtable (luaState); +// +// lua_pushstring (luaState, "peer"); +// push_peer (peers[i], tgl_peer_get (TLS, peers[i])); +// lua_settable (luaState, -3); +// +// struct tgl_message *M = tgl_message_get (TLS, msgs[i]); +// if (M && (M->flags & FLAG_CREATED)) { +// lua_pushstring (luaState, "message"); +// push_message (M); +// lua_settable (luaState, -3); +// } +// +// lua_pushstring (luaState, "unread"); +// lua_pushnumber (luaState, unread[i]); +// lua_settable (luaState, -3); +// +// lua_settable (luaState, -3); +// } +// } else { +// lua_pushboolean (luaState, 0); +// } +// assert (lua_gettop (luaState) == 4); +// +// +// int r = lua_pcall (luaState, 3, 0, 0); +// +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); +// +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +// +// free (cb); +//} +// +//void lua_msg_cb (struct tgl_state *TLSR, void *cb_extra, int success, struct tgl_message *M) { +// assert (TLSR == TLS); +// struct lua_query_extra *cb = cb_extra; +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); +// +// lua_pushnumber (luaState, success); +// +// if (success) { +// push_message (M); +// } else { +// lua_pushboolean (luaState, 0); +// } +// +// assert (lua_gettop (luaState) == 4); +// +// int r = lua_pcall (luaState, 3, 0, 0); +// +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); +// +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +// +// free (cb); +//} +// +//void lua_msg_list_cb (struct tgl_state *TLSR, void *cb_extra, int success, int num, struct tgl_message *M[]) { +// assert (TLSR == TLS); +// struct lua_query_extra *cb = cb_extra; +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); +// +// lua_pushnumber (luaState, success); +// +// if (success) { +// lua_newtable (luaState); +// int i; +// for (i = 0; i < num; i++) { +// lua_pushnumber (luaState, i); +// push_message (M[i]); +// lua_settable (luaState, -3); +// } +// } else { +// lua_pushboolean (luaState, 0); +// } +// +// assert (lua_gettop (luaState) == 4); +// +// int r = lua_pcall (luaState, 3, 0, 0); +// +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); +// +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +// +// free (cb); +//} +// +//void lua_file_cb (struct tgl_state *TLSR, void *cb_extra, int success, char *file_name) { +// assert (TLSR == TLS); +// struct lua_query_extra *cb = cb_extra; +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); +// +// lua_pushnumber (luaState, success); +// +// if (success) { +// lua_pushstring (luaState, file_name); +// } else { +// lua_pushboolean (luaState, 0); +// } +// +// assert (lua_gettop (luaState) == 4); +// +// int r = lua_pcall (luaState, 3, 0, 0); +// +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); +// +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +// +// free (cb); +//} +// +//void lua_chat_cb (struct tgl_state *TLSR, void *cb_extra, int success, struct tgl_chat *C) { +// assert (TLSR == TLS); +// struct lua_query_extra *cb = cb_extra; +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); +// +// lua_pushnumber (luaState, success); +// +// if (success) { +// push_peer (C->id, (void *)C); +// } else { +// lua_pushboolean (luaState, 0); +// } +// +// assert (lua_gettop (luaState) == 4); +// +// int r = lua_pcall (luaState, 3, 0, 0); +// +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); +// +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +// +// free (cb); +//} +// +//void lua_secret_chat_cb (struct tgl_state *TLSR, void *cb_extra, int success, struct tgl_secret_chat *C) { +// assert (TLSR == TLS); +// struct lua_query_extra *cb = cb_extra; +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); +// +// lua_pushnumber (luaState, success); +// +// if (success) { +// push_peer (C->id, (void *)C); +// } else { +// lua_pushboolean (luaState, 0); +// } +// +// assert (lua_gettop (luaState) == 4); +// +// int r = lua_pcall (luaState, 3, 0, 0); +// +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); +// +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +// +// free (cb); +//} +// +//void lua_user_cb (struct tgl_state *TLSR, void *cb_extra, int success, struct tgl_user *C) { +// assert (TLSR == TLS); +// struct lua_query_extra *cb = cb_extra; +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); +// +// lua_pushnumber (luaState, success); +// +// if (success) { +// push_peer (C->id, (void *)C); +// } else { +// lua_pushboolean (luaState, 0); +// } +// +// assert (lua_gettop (luaState) == 4); +// +// int r = lua_pcall (luaState, 3, 0, 0); +// +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); +// +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +// +// free (cb); +//} +// +//void lua_str_cb (struct tgl_state *TLSR, void *cb_extra, int success, char *data) { +// assert (TLSR == TLS); +// struct lua_query_extra *cb = cb_extra; +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->func); +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, cb->param); +// +// lua_pushnumber (luaState, success); +// +// if (success) { +// lua_pushstring (luaState, data); +// } else { +// lua_pushboolean (luaState, 0); +// } +// +// assert (lua_gettop (luaState) == 4); +// +// int r = lua_pcall (luaState, 3, 0, 0); +// +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->func); +// luaL_unref (luaState, LUA_REGISTRYINDEX, cb->param); +// +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +// +// free (cb); +//} +// +//void lua_do_all (void) { +// int p = 0; +// while (p < pos) { +// int l = (long)lua_ptr[p ++]; +// assert (p + l + 1 <= pos); +// enum lua_query_type f = (long)lua_ptr[p ++]; +// struct tgl_message *M; +// char *s, *s1, *s2, *s3; +// switch (f) { +// case lq_contact_list: +// tgl_do_update_contact_list (TLS, lua_contact_list_cb, lua_ptr[p ++]); +// break; +// case lq_dialog_list: +// tgl_do_get_dialog_list (TLS, lua_dialog_list_cb, lua_ptr[p ++]); +// break; +// case lq_msg: +// tgl_do_send_message (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], strlen (lua_ptr[p + 2]), lua_msg_cb, lua_ptr[p]); +// free (lua_ptr[p + 2]); +// p += 3; +// break; +// case lq_send_typing: +// tgl_do_send_typing (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, tgl_typing_typing, lua_empty_cb, lua_ptr[p]); +// p += 2; +// break; +// case lq_send_typing_abort: +// tgl_do_send_typing (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, tgl_typing_cancel, lua_empty_cb, lua_ptr[p]); +// p += 2; +// break; +// case lq_rename_chat: +// tgl_do_rename_chat (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); +// free (lua_ptr[p + 2]); +// p += 3; +// break; +// case lq_send_photo: +// tgl_do_send_document (TLS, -1, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); +// free (lua_ptr[p + 2]); +// p += 3; +// break; +// case lq_send_video: +// tgl_do_send_document (TLS, FLAG_DOCUMENT_VIDEO, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); +// free (lua_ptr[p + 2]); +// p += 3; +// break; +// case lq_send_audio: +// tgl_do_send_document (TLS, FLAG_DOCUMENT_AUDIO, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); +// free (lua_ptr[p + 2]); +// p += 3; +// break; +// case lq_send_document: +// tgl_do_send_document (TLS, 0, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); +// free (lua_ptr[p + 2]); +// p += 3; +// break; +// case lq_send_file: +// tgl_do_send_document (TLS, -2, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); +// free (lua_ptr[p + 2]); +// p += 3; +// break; +// case lq_send_text: +// tgl_do_send_text (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); +// free (lua_ptr[p + 2]); +// p += 3; +// break; +// case lq_chat_set_photo: +// tgl_do_set_chat_photo (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_ptr[p + 2], lua_msg_cb, lua_ptr[p]); +// free (lua_ptr[p + 2]); +// p += 3; +// break; +// case lq_load_photo: +// case lq_load_video: +// case lq_load_audio: +// case lq_load_document: +// M = lua_ptr[p + 1]; +// if (!M || (M->media.type != tgl_message_media_photo && M->media.type != tgl_message_media_photo_encr && M->media.type != tgl_message_media_document && M->media.type != tgl_message_media_document_encr)) { +// lua_file_cb (TLS, lua_ptr[p], 0, 0); +// } else { +// if (M->media.type == tgl_message_media_photo) { +// tgl_do_load_photo (TLS, &M->media.photo, lua_file_cb, lua_ptr[p]); +// } else if (M->media.type == tgl_message_media_document) { +// tgl_do_load_document (TLS, &M->media.document, lua_file_cb, lua_ptr[p]); +// } else { +// tgl_do_load_encr_document (TLS, &M->media.encr_document, lua_file_cb, lua_ptr[p]); +// } +// } +// p += 2; +// break; +// case lq_load_video_thumb: +// case lq_load_document_thumb: +// M = lua_ptr[p + 1]; +// if (!M || (M->media.type != tgl_message_media_document)) { +// lua_file_cb (TLS, lua_ptr[p], 0, 0); +// } else { +// tgl_do_load_document_thumb (TLS, &M->media.document, lua_file_cb, lua_ptr[p]); +// } +// p += 2; +// break; +// case lq_fwd: +// tgl_do_forward_message (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, ((struct tgl_message *)lua_ptr[p + 2])->id, lua_msg_cb, lua_ptr[p]); +// p += 3; +// break; +// case lq_fwd_media: +// tgl_do_forward_media (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, ((struct tgl_message *)lua_ptr[p + 2])->id, lua_msg_cb, lua_ptr[p]); +// p += 3; +// break; +// case lq_chat_info: +// tgl_do_get_chat_info (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, 0, lua_chat_cb, lua_ptr[p]); +// p += 2; +// break; +// case lq_user_info: +// tgl_do_get_user_info (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, 0, lua_user_cb, lua_ptr[p]); +// p += 2; +// break; +// case lq_history: +// tgl_do_get_history (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, (long)lua_ptr[p + 2], 0, lua_msg_list_cb, lua_ptr[p]); +// p += 3; +// break; +// case lq_chat_add_user: +// tgl_do_add_user_to_chat (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, ((tgl_peer_t *)lua_ptr[p + 2])->id, 10, lua_msg_cb, lua_ptr[p]); +// p += 3; +// break; +// case lq_chat_del_user: +// tgl_do_del_user_from_chat (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, ((tgl_peer_t *)lua_ptr[p + 2])->id, lua_msg_cb, lua_ptr[p]); +// p += 3; +// break; +// case lq_add_contact: +// s1 = lua_ptr[p + 1]; +// s2 = lua_ptr[p + 2]; +// s3 = lua_ptr[p + 3]; +// tgl_do_add_contact (TLS, s1, strlen (s1), s2, strlen (s2), s3, strlen (s3), 0, lua_contact_list_cb, lua_ptr[p]); +// free (s1); +// free (s2); +// free (s3); +// p += 4; +// break; +// case lq_del_contact: +// tgl_do_del_contact (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_empty_cb, lua_ptr[p]); +// p += 2; +// break; +// case lq_rename_contact: +// s1 = lua_ptr[p + 1]; +// s2 = lua_ptr[p + 2]; +// s3 = lua_ptr[p + 3]; +// tgl_do_add_contact (TLS, s1, strlen (s1), s2, strlen (s2), s3, strlen (s3), 1, lua_contact_list_cb, lua_ptr[p]); +// free (s1); +// free (s2); +// free (s3); +// p += 4; +// break; +// case lq_search: +// s = lua_ptr[p + 2]; +// tgl_do_msg_search (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, 0, 0, 40, 0, s, lua_msg_list_cb, lua_ptr[p]); +// free (s); +// p += 3; +// break; +// case lq_global_search: +// s = lua_ptr[p + 1]; +// tgl_do_msg_search (TLS, tgl_set_peer_id (TGL_PEER_UNKNOWN, 0), 0, 0, 40, 0, s, lua_msg_list_cb, lua_ptr[p]); +// free (s); +// p += 2; +// break; +// case lq_mark_read: +// tgl_do_mark_read (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_empty_cb, lua_ptr[p]); +// p += 2; +// break; +// case lq_set_profile_photo: +// s = lua_ptr[p + 1]; +// tgl_do_set_profile_photo (TLS, s, lua_empty_cb, lua_ptr[p]); +// free (s); +// p += 2; +// break; +// case lq_set_profile_name: +// s1 = lua_ptr[p + 1]; +// s2 = lua_ptr[p + 1]; +// tgl_do_set_profile_name (TLS, s1, s2, lua_user_cb, lua_ptr[p]); +// free (s1); +// free (s2); +// p += 3; +// break; +// case lq_create_secret_chat: +// tgl_do_create_secret_chat (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, lua_secret_chat_cb, lua_ptr[p]); +// p += 2; +// break; +// case lq_create_group_chat: +// s = lua_ptr[p + 2]; +// tgl_do_create_group_chat (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, s, lua_msg_cb, lua_ptr[p]); +// free (s); +// p += 3; +// break; +// case lq_delete_msg: +// tgl_do_delete_msg (TLS, ((struct tgl_message *)lua_ptr[p + 1])->id, lua_empty_cb, lua_ptr[p]); +// p += 2; +// break; +// case lq_restore_msg: +// tgl_do_delete_msg (TLS, (long)lua_ptr[p + 1], lua_empty_cb, lua_ptr[p]); +// p += 2; +// break; +// case lq_accept_secret_chat: +// tgl_do_accept_encr_chat_request (TLS, lua_ptr[p + 1], lua_secret_chat_cb, lua_ptr[p]); +// p += 2; +// break; +// case lq_send_contact: +// s1 = lua_ptr[p + 2]; +// s2 = lua_ptr[p + 3]; +// s3 = lua_ptr[p + 4]; +// tgl_do_send_contact (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id, s1, strlen (s1), s2, strlen (s2), s3, strlen (s3), lua_msg_cb, lua_ptr[p]); +// free (s1); +// free (s2); +// free (s3); +// p += 5; +// break; +// case lq_status_online: +// tgl_do_update_status (TLS, 1, lua_empty_cb, lua_ptr[p]); +// p ++; +// break; +// case lq_status_offline: +// tgl_do_update_status (TLS, 0, lua_empty_cb, lua_ptr[p]); +// p ++; +// break; +// case lq_extf: +// s = lua_ptr[p + 1]; +// tgl_do_send_extf (TLS, s, strlen (s), lua_str_cb, lua_ptr[p]); +// free (s); +// p += 2; +// break; +// case lq_send_location: +// if (sizeof (void *) == 4) { +// tgl_do_send_location (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id , *(float *)(lua_ptr + p + 2), *(float *)(lua_ptr + p + 3), lua_msg_cb, lua_ptr[p]); +// } else { +// tgl_do_send_location (TLS, ((tgl_peer_t *)lua_ptr[p + 1])->id , *(double *)(lua_ptr + p + 2), *(double *)(lua_ptr + p + 3), lua_msg_cb, lua_ptr[p]); +// } +// p += 4; +// break; +// /* +// lq_delete_msg, +// lq_restore_msg, +// case 0: +// tgl_do_send_message (((tgl_peer_t *)lua_ptr[p])->id, lua_ptr[p + 1], strlen (lua_ptr[p + 1]), 0, 0); +// free (lua_ptr[p + 1]); +// p += 2; +// break; +// case 1: +// tgl_do_forward_message (((tgl_peer_t *)lua_ptr[p])->id, (long)lua_ptr[p + 1], 0, 0); +// p += 2; +// break; +// case 2: +// tgl_do_mark_read (((tgl_peer_t *)lua_ptr[p])->id, 0, 0); +// p += 1; +// break;*/ +// default: +// assert (0); +// } +// } +// pos = 0; +//} +// +// +//enum lua_function_param { +// lfp_none, +// lfp_peer, +// lfp_chat, +// lfp_user, +// lfp_secret_chat, +// lfp_string, +// lfp_number, +// lfp_positive_number, +// lfp_nonnegative_number, +// lfp_msg, +// lfp_double +//}; +// +//struct lua_function { +// char *name; +// enum lua_query_type type; +// enum lua_function_param params[10]; +//}; +// +//struct lua_function functions[] = { +// {"get_contact_list", lq_contact_list, { lfp_none }}, +// {"get_dialog_list", lq_dialog_list, { lfp_none }}, +// {"rename_chat", lq_rename_chat, { lfp_chat, lfp_string, lfp_none }}, +// {"send_msg", lq_msg, { lfp_peer, lfp_string, lfp_none }}, +// {"send_typing", lq_send_typing, { lfp_peer, lfp_none }}, +// {"send_typing_abort", lq_send_typing_abort, { lfp_peer, lfp_none }}, +// {"send_photo", lq_send_photo, { lfp_peer, lfp_string, lfp_none }}, +// {"send_video", lq_send_video, { lfp_peer, lfp_string, lfp_none }}, +// {"send_audio", lq_send_audio, { lfp_peer, lfp_string, lfp_none }}, +// {"send_document", lq_send_document, { lfp_peer, lfp_string, lfp_none }}, +// {"send_file", lq_send_file, { lfp_peer, lfp_string, lfp_none }}, +// {"send_text", lq_send_text, { lfp_peer, lfp_string, lfp_none }}, +// {"chat_set_photo", lq_chat_set_photo, { lfp_chat, lfp_string, lfp_none }}, +// {"load_photo", lq_load_photo, { lfp_msg, lfp_none }}, +// {"load_video", lq_load_video, { lfp_msg, lfp_none }}, +// {"load_video_thumb", lq_load_video_thumb, { lfp_msg, lfp_none }}, +// {"load_audio", lq_load_audio, { lfp_msg, lfp_none }}, +// {"load_document", lq_load_document, { lfp_msg, lfp_none }}, +// {"load_document_thumb", lq_load_document_thumb, { lfp_msg, lfp_none }}, +// {"fwd_msg", lq_fwd, { lfp_peer, lfp_msg, lfp_none }}, +// {"fwd_media", lq_fwd_media, { lfp_peer, lfp_msg, lfp_none }}, +// {"chat_info", lq_chat_info, { lfp_chat, lfp_none }}, +// {"user_info", lq_user_info, { lfp_user, lfp_none }}, +// {"get_history", lq_history, { lfp_peer, lfp_nonnegative_number, lfp_none }}, +// {"chat_add_user", lq_chat_add_user, { lfp_chat, lfp_user, lfp_none }}, +// {"chat_del_user", lq_chat_del_user, { lfp_chat, lfp_user, lfp_none }}, +// {"add_contact", lq_add_contact, { lfp_string, lfp_string, lfp_string, lfp_none }}, +// {"del_contact", lq_del_contact, { lfp_user, lfp_none }}, +// {"rename_contact", lq_rename_contact, { lfp_string, lfp_string, lfp_string, lfp_none }}, +// {"msg_search", lq_search, { lfp_peer, lfp_string, lfp_none }}, +// {"msg_global_search", lq_global_search, { lfp_string, lfp_none }}, +// {"mark_read", lq_mark_read, { lfp_peer, lfp_none }}, +// {"set_profile_photo", lq_set_profile_photo, { lfp_string, lfp_none }}, +// {"set_profile_name", lq_set_profile_name, { lfp_string, lfp_none }}, +// {"create_secret_chat", lq_create_secret_chat, { lfp_user, lfp_none }}, +// {"create_group_chat", lq_create_group_chat, { lfp_user, lfp_string, lfp_none }}, +// {"delete_msg", lq_delete_msg, { lfp_msg, lfp_none }}, +// {"restore_msg", lq_restore_msg, { lfp_positive_number, lfp_none }}, +// {"accept_secret_chat", lq_accept_secret_chat, { lfp_secret_chat, lfp_none }}, +// {"send_contact", lq_send_contact, { lfp_peer, lfp_string, lfp_string, lfp_string, lfp_none }}, +// {"status_online", lq_status_online, { lfp_none }}, +// {"status_offline", lq_status_offline, { lfp_none }}, +// {"send_location", lq_send_location, { lfp_peer, lfp_double, lfp_double, lfp_none }}, +// {"ext_function", lq_extf, { lfp_string, lfp_none }}, +// { 0, 0, { lfp_none}} +//}; +// +//static int parse_lua_function (lua_State *L, struct lua_function *F) { +// int p = 0; +// while (F->params[p] != lfp_none) { p ++; } +// if (lua_gettop (L) != p + 2) { +// lua_pushboolean (L, 0); +// return 1; +// } +// +// int a1 = luaL_ref (L, LUA_REGISTRYINDEX); +// int a2 = luaL_ref (L, LUA_REGISTRYINDEX); +// +// struct lua_query_extra *e = malloc (sizeof (*e)); +// assert (e); +// e->func = a2; +// e->param = a1; +// +// assert (pos + 3 + p < MAX_LUA_COMMANDS); +// +// lua_ptr[pos ++] = (void *)(long)(p + 1); +// lua_ptr[pos ++] = (void *)(long)F->type; +// lua_ptr[pos ++] = e; +// +// int sp = p; +// int ok = 1; +// int cc = 0; +// while (p > 0) { +// p --; +// cc ++; +// const char *s; +// tgl_peer_t *P; +// long long num; +// double dval; +// struct tgl_message *M; +// switch (F->params[p]) { +// case lfp_none: +// assert (0); +// break; +// case lfp_peer: +// case lfp_user: +// case lfp_chat: +// case lfp_secret_chat: +// s = lua_tostring (L, -cc); +// if (!s) { +// ok = 0; +// break; +// } +// if (sscanf (s, "user#id%lld", &num) == 1 && num > 0) { +// tgl_insert_empty_user (TLS, num); +// P = tgl_peer_get (TLS, TGL_MK_USER (num)); +// } else if (sscanf (s, "chat#id%lld", &num) == 1 && num > 0) { +// tgl_insert_empty_chat (TLS, num); +// P = tgl_peer_get (TLS, TGL_MK_CHAT (num)); +// } else { +// P = get_peer (s); +// } +// if (!P/* || !(P->flags & FLAG_CREATED)*/) { +// ok = 0; +// break; +// } +// if (F->params[p] != lfp_peer) { +// if ((tgl_get_peer_type (P->id) == TGL_PEER_USER && F->params[p] != lfp_user) || +// (tgl_get_peer_type (P->id) == TGL_PEER_CHAT && F->params[p] != lfp_chat) || +// (tgl_get_peer_type (P->id) == TGL_PEER_ENCR_CHAT && F->params[p] != lfp_secret_chat)) { +// ok = 0; +// break; +// } +// } +// lua_ptr[pos + p] = P; +// break; +// +// case lfp_string: +// s = lua_tostring (L, -cc); +// if (!s) { +// ok = 0; +// break; +// } +// lua_ptr[pos + p] = (void *)s; +// break; +// +// case lfp_number: +// num = lua_tonumber (L, -cc); +// +// lua_ptr[pos + p] = (void *)(long)num; +// break; +// +// case lfp_double: +// dval = lua_tonumber (L, -cc); +// +// if (sizeof (void *) == 4) { +// *(float *)(lua_ptr + pos + p) = dval; +// } else { +// assert (sizeof (void *) >= 8); +// *(double *)(lua_ptr + pos + p) = dval; +// } +// break; +// +// case lfp_positive_number: +// num = lua_tonumber (L, -cc); +// if (num <= 0) { +// ok = 0; +// break; +// } +// +// lua_ptr[pos + p] = (void *)(long)num; +// break; +// +// case lfp_nonnegative_number: +// num = lua_tonumber (L, -cc); +// if (num < 0) { +// ok = 0; +// break; +// } +// +// lua_ptr[pos + p] = (void *)(long)num; +// break; +// +// case lfp_msg: +// s = lua_tostring (L, -cc); +// if (!s || !strlen (s)) { +// ok = 0; +// break; +// } +// +// num = atoll (s); +// +// M = tgl_message_get (TLS, num); +// +// if (!M || !(M->flags & FLAG_CREATED)) { +// ok = 0; +// break; +// } +// +// lua_ptr[pos + p] = M; +// break; +// +// default: +// assert (0); +// } +// } +// if (!ok) { +// luaL_unref (luaState, LUA_REGISTRYINDEX, a1); +// luaL_unref (luaState, LUA_REGISTRYINDEX, a2); +// free (e); +// pos -= 3; +// lua_pushboolean (L, 0); +// return 1; +// } +// +// for (p = 0; p < sp; p++) { +// if (F->params[p] == lfp_string) { +// lua_ptr[pos + p] = strdup (lua_ptr[pos + p]); +// } +// } +// pos += p; +// +// lua_pushboolean (L, 1); +// return 1; +//} +// +// +//static void lua_postpone_alarm (evutil_socket_t fd, short what, void *arg) { +// int *t = arg; +// +// lua_settop (luaState, 0); +// //lua_checkstack (luaState, 20); +// my_lua_checkstack (luaState, 20); +// +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, t[1]); +// lua_rawgeti (luaState, LUA_REGISTRYINDEX, t[0]); +// assert (lua_gettop (luaState) == 2); +// +// int r = lua_pcall (luaState, 1, 0, 0); +// +// luaL_unref (luaState, LUA_REGISTRYINDEX, t[0]); +// luaL_unref (luaState, LUA_REGISTRYINDEX, t[1]); +// +// if (r) { +// logprintf ("lua: %s\n", lua_tostring (luaState, -1)); +// } +// +//} +// +//static int postpone_from_lua (lua_State *L) { +// int n = lua_gettop (L); +// if (n != 3) { +// lua_pushboolean (L, 0); +// return 1; +// } +// +// double timeout = lua_tonumber (L, -1); +// if (timeout < 0) { +// lua_pushboolean (L, 0); +// return 1; +// } +// +// lua_pop (L, 1); +// int a1 = luaL_ref (L, LUA_REGISTRYINDEX); +// int a2 = luaL_ref (L, LUA_REGISTRYINDEX); +// +// +// int *t = malloc (16); +// assert (t); +// struct event *ev = evtimer_new (TLS->ev_base, lua_postpone_alarm, t); +// t[0] = a1; +// t[1] = a2; +// *(void **)(t + 2) = ev; +// +// struct timeval ts= { +// .tv_sec = (long)timeout, +// .tv_usec = (timeout - ((long)timeout)) * 1000000 +// }; +// event_add (ev, &ts); +// +// lua_pushboolean (L, 1); +// return 1; +//} +// +//extern int safe_quit; +//static int safe_quit_from_lua (lua_State *L) { +// int n = lua_gettop (L); +// if (n != 0) { +// lua_pushboolean (L, 0); +// return 1; +// } +// safe_quit = 1; +// +// lua_pushboolean (L, 1); +// return 1; +//} +// +//static int universal_from_lua (lua_State *L) { +// const char *s = lua_tostring(L, lua_upvalueindex(1)); +// if (!s) { +// lua_pushboolean (L, 0); +// return 1; +// } +// int i = 0; +// while (functions[i].name) { +// if (!strcmp (functions[i].name, s)) { +// return parse_lua_function (L, &functions[i]); +// } +// i ++; +// } +// lua_pushboolean (L, 0); +// return 1; +//} +// +// +//static void my_python_register (const char *name, lua_CFunction f) { +// lua_pushstring(L, name); +// lua_pushcclosure(L, f, 1); +// lua_setglobal(L, name); +//} +// +// void py_init (const char *file) { if (!file) { return; } have_file = 1; - PyObject *pName, *pModule; +// PyObject *pName;//, *pModule; - Py_Initialize() + Py_Initialize(); - pName = PyFile_FromFile(file, "telegram.py", 'r', null); +// pName = PyFile_FromFile(file, "telegram.py", 'r', null); - err = PyErr_Occurred(); - if (err != NULL) { - logprintf("python error occurred"); // TODO: implement the backtrace - exit(1); - } +// PyObject* err = PyErr_Occurred(); +// if (err != NULL) { +// logprintf("python error occurred"); // TODO: implement the backtrace +// exit(1); +// } - int i = 0; - while (functions[i].name) { - my_lua_register (luaState, functions[i].name, universal_from_lua); - i ++; - } +// int i = 0; +// while (functions[i].name) { +// my_lua_register (luaState, functions[i].name, universal_from_lua); +// i ++; +// } //lua_register (luaState, "fwd_msg", fwd_msg_from_lua); //lua_register (luaState, "mark_read", mark_read_from_lua); - lua_register (luaState, "postpone", postpone_from_lua); - lua_register (luaState, "safe_quit", safe_quit_from_lua); +// lua_register (luaState, "postpone", postpone_from_lua); +// lua_register (luaState, "safe_quit", safe_quit_from_lua); //lua_register (luaState, "get_contact_list", get_contacts_from_lua); /*lua_register (luaState, "get_dialog_list", get_dialog_list_from_lua); lua_register (luaState, "send_msg", send_msg_from_lua); @@ -1487,11 +1486,6 @@ void py_init (const char *file) { lua_register (luaState, "add_contact", add_contact_from_lua); lua_register (luaState, "rename_contact", rename_contact_from_lua);*/ - int ret = luaL_dofile (luaState, file); - if (ret) { - logprintf ("lua: %s\n", lua_tostring (luaState, -1)); - exit (1); - } } #endif