Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
T
tg
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
tg
Commits
871fc440
Commit
871fc440
authored
May 12, 2015
by
Vincent Castellano
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add Callback support for async calls.
parent
c263a93a
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
309 additions
and
426 deletions
+309
-426
python-tg.c
python-tg.c
+304
-425
tgl-test.py
tgl-test.py
+5
-1
No files found.
python-tg.c
View file @
871fc440
...
...
@@ -641,424 +641,362 @@ enum py_query_type {
pq_extf
};
struct
py_query_extra
{
int
func
;
int
param
;
};
void
py_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);
assert
(
TLSR
==
TLS
);
PyObject
*
callable
=
cb_extra
;
PyObject
*
arglist
=
NULL
;
PyObject
*
result
=
NULL
;
if
(
PyCallable_Check
(
callable
))
{
arglist
=
Py_BuildValue
(
"(O)"
,
success
?
Py_True
:
Py_False
);
result
=
PyEval_CallObject
(
callable
,
arglist
);
Py_DECREF
(
arglist
);
if
(
result
==
NULL
)
PyErr_Print
();
Py_XDECREF
(
result
);
}
Py_XDECREF
(
callable
);
}
void
py_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);
assert
(
TLSR
==
TLS
);
PyObject
*
callable
=
cb_extra
;
PyObject
*
arglist
=
NULL
;
PyObject
*
peers
=
NULL
;
PyObject
*
result
=
NULL
;
if
(
PyCallable_Check
(
callable
))
{
peers
=
PyList_New
(
0
);
if
(
success
)
{
int
i
;
for
(
i
=
0
;
i
<
num
;
i
++
)
{
PyList_Append
(
peers
,
get_peer
(
UL
[
i
]
->
id
,
(
void
*
)
UL
[
i
]));
}
}
arglist
=
Py_BuildValue
(
"(OO)"
,
success
?
Py_True
:
Py_False
,
peers
);
result
=
PyEval_CallObject
(
callable
,
arglist
);
Py_DECREF
(
arglist
);
if
(
result
==
NULL
)
PyErr_Print
();
Py_XDECREF
(
result
);
}
Py_XDECREF
(
callable
);
}
void
py_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);
assert
(
TLSR
==
TLS
);
PyObject
*
callable
=
cb_extra
;
PyObject
*
arglist
=
NULL
;
PyObject
*
dialog_list
=
NULL
;
PyObject
*
dialog
=
NULL
;
PyObject
*
result
=
NULL
;
if
(
PyCallable_Check
(
callable
))
{
dialog_list
=
PyList_New
(
0
);
if
(
success
)
{
int
i
;
for
(
i
=
0
;
i
<
num
;
i
++
)
{
dialog
=
PyDict_New
();
PyDict_SetItemString
(
dialog
,
"peer"
,
get_peer
(
peers
[
i
],
tgl_peer_get
(
TLS
,
peers
[
i
])));
struct
tgl_message
*
M
=
tgl_message_get
(
TLS
,
msgs
[
i
]);
if
(
M
&&
(
M
->
flags
&
FLAG_CREATED
))
{
PyDict_SetItemString
(
dialog
,
"message"
,
get_message
(
M
));
}
PyDict_SetItemString
(
dialog
,
"unread"
,
unread
[
i
]
?
Py_True
:
Py_False
);
PyList_Append
(
dialog_list
,
dialog
);
}
}
arglist
=
Py_BuildValue
(
"(OO)"
,
success
?
Py_True
:
Py_False
,
dialog_list
);
result
=
PyEval_CallObject
(
callable
,
arglist
);
Py_DECREF
(
arglist
);
if
(
result
==
NULL
)
PyErr_Print
();
Py_XDECREF
(
result
);
}
Py_XDECREF
(
callable
);
}
void
py_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);
PyObject
*
callable
=
cb_extra
;
PyObject
*
arglist
=
NULL
;
PyObject
*
msg
=
NULL
;
PyObject
*
result
=
NULL
;
if
(
PyCallable_Check
(
callable
))
{
if
(
success
)
{
msg
=
get_message
(
M
);
}
else
{
Py_INCREF
(
Py_None
);
msg
=
Py_None
;
}
arglist
=
Py_BuildValue
(
"(OO)"
,
success
?
Py_True
:
Py_False
,
msg
);
result
=
PyEval_CallObject
(
callable
,
arglist
);
Py_DECREF
(
arglist
);
if
(
result
==
NULL
)
PyErr_Print
();
Py_XDECREF
(
result
);
}
Py_XDECREF
(
callable
);
}
void
py_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);
assert
(
TLSR
==
TLS
);
PyObject
*
callable
=
cb_extra
;
PyObject
*
arglist
=
NULL
;
PyObject
*
msgs
=
NULL
;
PyObject
*
result
=
NULL
;
if
(
PyCallable_Check
(
callable
))
{
msgs
=
PyList_New
(
0
);
if
(
success
)
{
int
i
;
for
(
i
=
0
;
i
<
num
;
i
++
)
{
PyList_Append
(
msgs
,
get_message
(
M
[
i
]));
}
}
arglist
=
Py_BuildValue
(
"(OO)"
,
success
?
Py_True
:
Py_False
,
msgs
);
result
=
PyEval_CallObject
(
callable
,
arglist
);
Py_DECREF
(
arglist
);
if
(
result
==
NULL
)
PyErr_Print
();
Py_XDECREF
(
result
);
}
Py_XDECREF
(
callable
);
}
void
py_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);
assert
(
TLSR
==
TLS
);
PyObject
*
callable
=
cb_extra
;
PyObject
*
arglist
=
NULL
;
PyObject
*
filename
=
NULL
;
PyObject
*
result
=
NULL
;
if
(
PyCallable_Check
(
callable
))
{
if
(
success
)
filename
=
PyUnicode_FromString
(
file_name
);
else
{
Py_INCREF
(
Py_None
);
filename
=
Py_None
;
}
arglist
=
Py_BuildValue
(
"(OO)"
,
success
?
Py_True
:
Py_False
,
filename
);
result
=
PyEval_CallObject
(
callable
,
arglist
);
Py_DECREF
(
arglist
);
if
(
result
==
NULL
)
PyErr_Print
();
Py_XDECREF
(
result
);
}
Py_XDECREF
(
callable
);
}
void
py_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);
assert
(
TLSR
==
TLS
);
PyObject
*
callable
=
cb_extra
;
PyObject
*
arglist
=
NULL
;
PyObject
*
peer
=
NULL
;
PyObject
*
result
=
NULL
;
if
(
PyCallable_Check
(
callable
))
{
if
(
success
)
{
peer
=
get_peer
(
C
->
id
,
(
void
*
)
C
);
}
else
{
Py_INCREF
(
Py_None
);
peer
=
Py_None
;
}
arglist
=
Py_BuildValue
(
"(OO)"
,
success
?
Py_True
:
Py_False
,
peer
);
result
=
PyEval_CallObject
(
callable
,
arglist
);
Py_DECREF
(
arglist
);
if
(
result
==
NULL
)
PyErr_Print
();
Py_XDECREF
(
result
);
}
Py_XDECREF
(
callable
);
}
void
py_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);
assert
(
TLSR
==
TLS
);
PyObject
*
callable
=
cb_extra
;
PyObject
*
arglist
=
NULL
;
PyObject
*
peer
=
NULL
;
PyObject
*
result
=
NULL
;
if
(
PyCallable_Check
(
callable
))
{
if
(
success
)
{
peer
=
get_peer
(
C
->
id
,
(
void
*
)
C
);
}
else
{
Py_INCREF
(
Py_None
);
peer
=
Py_None
;
}
arglist
=
Py_BuildValue
(
"(OO)"
,
success
?
Py_True
:
Py_False
,
peer
);
result
=
PyEval_CallObject
(
callable
,
arglist
);
Py_DECREF
(
arglist
);
if
(
result
==
NULL
)
PyErr_Print
();
Py_XDECREF
(
result
);
}
Py_XDECREF
(
callable
);
}
void
py_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);
assert
(
TLSR
==
TLS
);
PyObject
*
callable
=
cb_extra
;
PyObject
*
arglist
=
NULL
;
PyObject
*
peer
=
NULL
;
PyObject
*
result
=
NULL
;
if
(
PyCallable_Check
(
callable
))
{
if
(
success
)
{
peer
=
get_peer
(
C
->
id
,
(
void
*
)
C
);
}
else
{
Py_INCREF
(
Py_None
);
peer
=
Py_None
;
}
arglist
=
Py_BuildValue
(
"(OO)"
,
success
?
Py_True
:
Py_False
,
peer
);
result
=
PyEval_CallObject
(
callable
,
arglist
);
Py_DECREF
(
arglist
);
if
(
result
==
NULL
)
PyErr_Print
();
Py_XDECREF
(
result
);
}
Py_XDECREF
(
callable
);
}
void
py_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);
assert
(
TLSR
==
TLS
);
PyObject
*
callable
=
cb_extra
;
PyObject
*
arglist
=
NULL
;
PyObject
*
str
=
NULL
;
PyObject
*
result
=
NULL
;
if
(
PyCallable_Check
(
callable
))
{
if
(
success
)
str
=
PyUnicode_FromString
(
data
);
else
{
Py_INCREF
(
Py_None
);
str
=
Py_None
;
}
arglist
=
Py_BuildValue
(
"(OO)"
,
success
?
Py_True
:
Py_False
,
str
);
result
=
PyEval_CallObject
(
callable
,
arglist
);
Py_DECREF
(
arglist
);
if
(
result
==
NULL
)
PyErr_Print
();
Py_XDECREF
(
result
);
}
Py_XDECREF
(
callable
);
}
void
py_do_all
(
void
)
{
int
p
=
0
;
while
(
p
<
pos
)
{
assert
(
p
+
1
<=
pos
);
assert
(
p
+
2
<=
pos
);
enum
py_query_type
f
=
(
long
)
py_ptr
[
p
++
];
PyObject
*
args
=
(
PyObject
*
)
py_ptr
[
p
++
];
const
char
*
str
;
int
len
;
PyObject
*
pyObj1
=
NULL
;
PyObject
*
pyObj2
=
NULL
;
PyObject
*
cb_extra
;
//struct tgl_message *M;
tgl_peer_id_t
peer
,
peer1
;
switch
(
f
)
{
case
pq_contact_list
:
tgl_do_update_contact_list
(
TLS
,
py_contact_list_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"O"
,
&
cb_extra
);
tgl_do_update_contact_list
(
TLS
,
py_contact_list_cb
,
cb_extra
);
break
;
case
pq_dialog_list
:
tgl_do_get_dialog_list
(
TLS
,
py_dialog_list_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"O"
,
&
cb_extra
);
tgl_do_get_dialog_list
(
TLS
,
py_dialog_list_cb
,
cb_extra
);
break
;
case
pq_msg
:
PyArg_ParseTuple
(
args
,
"iis#
"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
,
&
len
);
tgl_do_send_message
(
TLS
,
peer
,
str
,
len
,
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iis#
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
,
&
len
,
&
cb_extra
);
tgl_do_send_message
(
TLS
,
peer
,
str
,
len
,
py_msg_cb
,
cb_extra
);
break
;
case
pq_send_typing
:
PyArg_ParseTuple
(
args
,
"ii
"
,
&
peer
.
type
,
&
peer
.
id
);
tgl_do_send_typing
(
TLS
,
peer
,
tgl_typing_typing
,
py_empty_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"ii
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
cb_extra
);
tgl_do_send_typing
(
TLS
,
peer
,
tgl_typing_typing
,
py_empty_cb
,
cb_extra
);
break
;
case
pq_send_typing_abort
:
PyArg_ParseTuple
(
args
,
"ii
"
,
&
peer
.
type
,
&
peer
.
id
);
tgl_do_send_typing
(
TLS
,
peer
,
tgl_typing_cancel
,
py_empty_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"ii
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
cb_extra
);
tgl_do_send_typing
(
TLS
,
peer
,
tgl_typing_cancel
,
py_empty_cb
,
cb_extra
);
break
;
case
pq_rename_chat
:
PyArg_ParseTuple
(
args
,
"iis
"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
);
tgl_do_rename_chat
(
TLS
,
peer
,
str
,
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iis
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
,
&
cb_extra
);
tgl_do_rename_chat
(
TLS
,
peer
,
str
,
py_msg_cb
,
cb_extra
);
break
;
case
pq_send_photo
:
PyArg_ParseTuple
(
args
,
"iis
"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
);
tgl_do_send_document
(
TLS
,
-
1
,
peer
,
str
,
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iis
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
,
&
cb_extra
);
tgl_do_send_document
(
TLS
,
-
1
,
peer
,
str
,
py_msg_cb
,
cb_extra
);
break
;
case
pq_send_video
:
PyArg_ParseTuple
(
args
,
"iis
"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
);
tgl_do_send_document
(
TLS
,
FLAG_DOCUMENT_VIDEO
,
peer
,
str
,
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iis
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
,
&
cb_extra
);
tgl_do_send_document
(
TLS
,
FLAG_DOCUMENT_VIDEO
,
peer
,
str
,
py_msg_cb
,
cb_extra
);
break
;
case
pq_send_audio
:
PyArg_ParseTuple
(
args
,
"iis
"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
);
tgl_do_send_document
(
TLS
,
FLAG_DOCUMENT_AUDIO
,
peer
,
str
,
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iis
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
,
&
cb_extra
);
tgl_do_send_document
(
TLS
,
FLAG_DOCUMENT_AUDIO
,
peer
,
str
,
py_msg_cb
,
cb_extra
);
break
;
case
pq_send_document
:
PyArg_ParseTuple
(
args
,
"iis
"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
);
tgl_do_send_document
(
TLS
,
0
,
peer
,
str
,
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iis
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
,
&
cb_extra
);
tgl_do_send_document
(
TLS
,
0
,
peer
,
str
,
py_msg_cb
,
cb_extra
);
break
;
case
pq_send_file
:
PyArg_ParseTuple
(
args
,
"iis
"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
);
tgl_do_send_document
(
TLS
,
-
2
,
peer
,
str
,
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iis
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
,
&
cb_extra
);
tgl_do_send_document
(
TLS
,
-
2
,
peer
,
str
,
py_msg_cb
,
cb_extra
);
break
;
case
pq_send_text
:
PyArg_ParseTuple
(
args
,
"iis
"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
);
tgl_do_send_text
(
TLS
,
peer
,
str
,
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iis
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
,
&
cb_extra
);
tgl_do_send_text
(
TLS
,
peer
,
str
,
py_msg_cb
,
cb_extra
);
break
;
case
pq_chat_set_photo
:
PyArg_ParseTuple
(
args
,
"iis
"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
);
tgl_do_set_chat_photo
(
TLS
,
peer
,
str
,
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iis
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
str
,
&
cb_extra
);
tgl_do_set_chat_photo
(
TLS
,
peer
,
str
,
py_msg_cb
,
cb_extra
);
break
;
/* case pq_load_photo:
case pq_load_video:
...
...
@@ -1103,12 +1041,12 @@ void py_do_all (void) {
break;
*/
case
pq_chat_add_user
:
PyArg_ParseTuple
(
args
,
"iiii
"
,
&
peer
.
type
,
&
peer
.
id
,
&
peer1
.
type
,
&
peer1
.
id
);
tgl_do_add_user_to_chat
(
TLS
,
peer
,
peer1
,
100
,
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iiii
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
peer1
.
type
,
&
peer1
.
id
,
&
cb_extra
);
tgl_do_add_user_to_chat
(
TLS
,
peer
,
peer1
,
100
,
py_msg_cb
,
cb_extra
);
break
;
case
pq_chat_del_user
:
PyArg_ParseTuple
(
args
,
"iiii
"
,
&
peer
.
type
,
&
peer
.
id
,
&
peer
.
type
,
&
peer
.
id
);
tgl_do_del_user_from_chat
(
TLS
,
peer
,
peer1
,
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iiii
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
peer
.
type
,
&
peer
.
id
,
&
cb_extra
);
tgl_do_del_user_from_chat
(
TLS
,
peer
,
peer1
,
py_msg_cb
,
cb_extra
);
break
;
/* case pq_add_contact:
tgl_do_add_contact (TLS, s1, strlen (s1), s2, strlen (s2), s3, strlen (s3), 0, py_contact_list_cb, py_ptr[p]);
...
...
@@ -1154,18 +1092,20 @@ void py_do_all (void) {
break;
*/
case
pq_status_online
:
tgl_do_update_status
(
TLS
,
1
,
py_empty_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"O"
,
&
cb_extra
);
tgl_do_update_status
(
TLS
,
1
,
py_empty_cb
,
cb_extra
);
break
;
case
pq_status_offline
:
tgl_do_update_status
(
TLS
,
0
,
py_empty_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"O"
,
&
cb_extra
);
tgl_do_update_status
(
TLS
,
0
,
py_empty_cb
,
cb_extra
);
break
;
/* case pq_extf:
tgl_do_send_extf (TLS, s, strlen (s), py_str_cb, py_ptr[p]);
break;
*/
case
pq_send_location
:
PyArg_ParseTuple
(
args
,
"iiOO
"
,
&
peer
.
type
,
&
peer
.
id
,
&
pyObj1
,
&
pyObj2
);
tgl_do_send_location
(
TLS
,
peer
,
PyFloat_AsDouble
(
pyObj1
),
PyFloat_AsDouble
(
pyObj2
),
py_msg_cb
,
NULL
);
PyArg_ParseTuple
(
args
,
"iiOO
O"
,
&
peer
.
type
,
&
peer
.
id
,
&
pyObj1
,
&
pyObj2
,
&
cb_extra
);
tgl_do_send_location
(
TLS
,
peer
,
PyFloat_AsDouble
(
pyObj1
),
PyFloat_AsDouble
(
pyObj2
),
py_msg_cb
,
cb_extra
);
Py_XDECREF
(
pyObj1
);
Py_XDECREF
(
pyObj2
);
break
;
...
...
@@ -1189,6 +1129,9 @@ void py_do_all (void) {
assert
(
0
);
}
// Increment reference on cb_extra as it is passed on to the callback to use
Py_XINCREF
(
cb_extra
);
// Clean up any arg variables we could have used.
//Py_XDECREF(args); // TODO: this is going negative ref and causing segfaults
...
...
@@ -1330,76 +1273,12 @@ MOD_INIT(tgl)
}
//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;
//}
//
extern
int
safe_quit
;
static
int
safe_quit_from_py
()
{
Py_Finalize
();
safe_quit
=
1
;
return
1
;
}
void
py_init
(
const
char
*
file
)
{
if
(
!
file
)
{
return
;
}
...
...
tgl-test.py
View file @
871fc440
...
...
@@ -16,6 +16,10 @@ def on_our_id(id):
our_id
=
id
return
"Set ID: "
+
str
(
our_id
)
def
msg_cb
(
success
,
msg
):
pp
.
pprint
(
success
)
pp
.
pprint
(
msg
)
def
on_msg_receive
(
msg
):
if
msg
[
"out"
]
and
not
binlog_done
:
return
;
...
...
@@ -33,7 +37,7 @@ def on_msg_receive(msg):
if
text
.
startswith
(
"!ping"
):
print
(
"SENDING PONG"
)
tgl
.
send_msg
(
ptype
,
pid
,
"PONG!"
)
tgl
.
send_msg
(
ptype
,
pid
,
"PONG!"
,
msg_cb
)
def
on_secret_chat_update
(
peer
,
types
):
return
"on_secret_chat_update"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment