Initial python class implementation complete.

This commit is contained in:
Vincent Castellano 2015-05-19 17:49:24 -07:00
parent 7c9129b0b4
commit fe030a69e2
3 changed files with 42 additions and 224 deletions

View File

@ -78,6 +78,7 @@
extern PyTypeObject tgl_PeerType; extern PyTypeObject tgl_PeerType;
extern PyTypeObject tgl_MsgType;
//#include "interface.h" //#include "interface.h"
@ -101,7 +102,6 @@ PyObject *_py_secret_chat_update;
PyObject *_py_user_update; PyObject *_py_user_update;
PyObject *_py_chat_update; PyObject *_py_chat_update;
PyObject* get_user (tgl_peer_t *P);
PyObject* get_peer (tgl_peer_id_t id, tgl_peer_t *P); PyObject* get_peer (tgl_peer_id_t id, tgl_peer_t *P);
// Utility functions // Utility functions
@ -155,67 +155,6 @@ PyObject* get_tgl_peer_type (int x) {
return type; return type;
} }
PyObject* get_user (tgl_peer_t *P) {
PyObject *user;
user = PyDict_New();
if(user == NULL)
assert(0); // TODO handle python exception
py_add_string_field (user, "first_name", P->user.first_name);
py_add_string_field (user, "last_name", P->user.last_name);
py_add_string_field (user, "real_first_name", P->user.real_first_name);
py_add_string_field (user, "real_last_name", P->user.real_last_name);
py_add_string_field (user, "phone", P->user.phone);
if (P->user.access_hash) {
py_add_num_field (user, "access_hash", 1);
}
if (P->user.username) {
py_add_string_field ( user, "username", P->user.username);
}
return user;
}
PyObject* get_chat (tgl_peer_t *P) {
PyObject *chat, *members;
chat = PyDict_New();
if(chat == NULL)
assert(0); // TODO handle python exception
assert (P->chat.title);
py_add_string_field (chat, "title", P->chat.title);
py_add_num_field (chat, "members_num", P->chat.users_num);
if (P->chat.user_list) {
members = PyList_New(P->chat.users_num);
if(members == NULL)
assert(0); // TODO handle python exception
int i;
for (i = 0; i < P->chat.users_num; i++) {
tgl_peer_id_t id = TGL_MK_USER (P->chat.user_list[i].user_id);
PyList_SetItem (members, i, get_peer(id, tgl_peer_get (TLS, id)));
}
PyDict_SetItemString (chat, "members", members);
}
return chat;
}
PyObject* get_encr_chat (tgl_peer_t *P) {
PyObject *encr_chat, *user;
encr_chat = PyDict_New();
if(encr_chat == NULL)
assert(0); // TODO handle python exception
user = get_peer (TGL_MK_USER (P->encr_chat.user_id), tgl_peer_get (TLS, TGL_MK_USER (P->encr_chat.user_id)));
PyDict_SetItemString (encr_chat, "user", user);
return encr_chat;
}
PyObject* get_update_types (unsigned flags) { PyObject* get_update_types (unsigned flags) {
PyObject* types; PyObject* types;
types = PyList_New(0); types = PyList_New(0);
@ -275,166 +214,16 @@ PyObject* get_update_types (unsigned flags) {
PyObject* get_peer (tgl_peer_id_t id, tgl_peer_t *P) { PyObject* get_peer (tgl_peer_id_t id, tgl_peer_t *P) {
PyObject *peer; PyObject *peer;
/*
peer = PyDict_New();
if(peer == NULL)
assert(0); // TODO handle python exception;
PyDict_SetItemString (peer, "type_str", get_tgl_peer_type (tgl_get_peer_type(id)));
PyDict_SetItemString (peer, "type", PyInt_FromLong(tgl_get_peer_type(id)));
PyDict_SetItemString (peer, "id", PyInt_FromLong(tgl_get_peer_id(id)));
if (!P || !(P->flags & TGLPF_CREATED)) {
PyObject *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);
}
name = PyDict_New();
if(name == NULL)
assert(0); // TODO handle python exception;
PyDict_SetItemString (name, "print_name", PyUnicode_FromString(s));
PyDict_SetItemString (peer, "peer", name);
} else {
PyObject *peer_obj;
switch (tgl_get_peer_type (id)) {
case TGL_PEER_USER:
peer_obj = get_user (P);
break;
case TGL_PEER_CHAT:
peer_obj = get_chat (P);
break;
case TGL_PEER_ENCR_CHAT:
peer_obj = get_encr_chat (P);
break;
default:
assert (0);
}
PyDict_SetItemString (peer, "peer", peer_obj);
}
*/
peer = tgl_Peer_FromTglPeer(P); peer = tgl_Peer_FromTglPeer(P);
return peer; return peer;
} }
PyObject* get_media (struct tgl_message_media *M) {
PyObject *media;
media = PyDict_New();
if(media == NULL)
assert(0); // TODO handle python exception
switch (M->type) {
case tgl_message_media_photo:
py_add_string_field (media, "type", "photo");
py_add_string_field (media, "caption", M->caption);
break;
case tgl_message_media_document:
case tgl_message_media_document_encr:
py_add_string_field (media, "type", "document");
break;
case tgl_message_media_unsupported:
py_add_string_field (media, "type", "unsupported");
break;
case tgl_message_media_geo:
py_add_string_field (media, "type", "geo");
py_add_num_field (media, "longitude", M->geo.longitude);
py_add_num_field (media, "latitude", M->geo.latitude);
break;
case tgl_message_media_contact:
py_add_string_field (media, "type", "contact");
py_add_string_field (media, "phone", M->phone);
py_add_string_field (media, "first_name", M->first_name);
py_add_string_field (media, "last_name", M->last_name);
py_add_num_field (media, "user_id", M->user_id);
break;
case tgl_message_media_webpage:
py_add_string_field (media, "type", "webpage");
py_add_string_field (media, "type", "webpage");
py_add_string_field (media, "url", M->webpage->url);
py_add_string_field (media, "title", M->webpage->title);
py_add_string_field (media, "description", M->webpage->description);
py_add_string_field (media, "author", M->webpage->author);
break;
case tgl_message_media_venue:
py_add_string_field (media, "type", "venue");
py_add_num_field (media, "longitude", M->venue.geo.longitude);
py_add_num_field (media, "latitude", M->venue.geo.latitude);
py_add_string_field (media, "title", M->venue.title);
py_add_string_field (media, "address", M->venue.address);
py_add_string_field (media, "provider", M->venue.provider);
py_add_string_field (media, "venue_id", M->venue.venue_id);
break;
default:
py_add_string_field (media, "type", "unknown");
}
return media;
}
PyObject* get_message (struct tgl_message *M) { PyObject* get_message (struct tgl_message *M) {
assert (M); assert (M);
PyObject *msg; PyObject *msg;
msg = PyDict_New(); msg = tgl_Msg_FromTglMsg(M);
if(msg == NULL)
assert(0); // TODO handle python exception
static char s[30];
snprintf (s, 30, "%lld", M->id);
py_add_string_field (msg, "id", s);
if (!(M->flags & TGLMF_CREATED)) {
Py_RETURN_NONE;
}
py_add_num_field (msg, "flags", M->flags);
if (tgl_get_peer_type (M->fwd_from_id)) {
PyDict_SetItemString(msg, "fwd_from", get_peer(M->fwd_from_id, tgl_peer_get (TLS, M->fwd_from_id)));
PyDict_SetItemString (msg, "fwd_date", get_datetime(M->fwd_date));
}
if (M->reply_id) {
snprintf (s, 30, "%lld", M->id);
py_add_string_field (msg, "reply_id", s);
struct tgl_message *MR = tgl_message_get (TLS, M->reply_id);
// Message details available only within session for now
if (MR) {
PyDict_SetItemString(msg, "reply_to", get_message(MR));
}
}
PyDict_SetItemString(msg, "from", get_peer(M->from_id, tgl_peer_get (TLS, M->from_id)));
PyDict_SetItemString(msg, "to", get_peer(M->to_id, tgl_peer_get (TLS, M->to_id)));
PyDict_SetItemString(msg, "mention", ((M->flags & TGLMF_MENTION) ? Py_True : Py_False));
PyDict_SetItemString(msg, "out", ((M->flags & TGLMF_OUT) ? Py_True : Py_False));
PyDict_SetItemString(msg, "unread", ((M->flags & TGLMF_UNREAD) ? Py_True : Py_False));
PyDict_SetItemString(msg, "service", ((M->flags & TGLMF_SERVICE) ? Py_True : Py_False));
PyDict_SetItemString(msg, "date", get_datetime(M->date));
if (!(M->flags & TGLMF_SERVICE)) {
if (M->message_len && M->message) {
PyDict_SetItemString(msg, "text", PyUnicode_FromStringAndSize(M->message, M->message_len));
}
if (M->media.type && M->media.type != tgl_message_media_none) {
PyDict_SetItemString(msg, "media", get_media(&M->media));
}
}
return msg; return msg;
} }
@ -1301,6 +1090,12 @@ MOD_INIT(tgl)
Py_INCREF(&tgl_PeerType); Py_INCREF(&tgl_PeerType);
PyModule_AddObject(m, "Peer", (PyObject *)&tgl_PeerType); PyModule_AddObject(m, "Peer", (PyObject *)&tgl_PeerType);
if (PyType_Ready(&tgl_MsgType) < 0)
return MOD_ERROR_VAL;
Py_INCREF(&tgl_MsgType);
PyModule_AddObject(m, "Msg", (PyObject *)&tgl_MsgType);
return MOD_SUCCESS_VAL(m); return MOD_SUCCESS_VAL(m);
} }

View File

@ -206,6 +206,28 @@ tgl_Peer_getusername (tgl_Peer *self, void *closure)
} }
static PyObject *
tgl_Peer_getuser (tgl_Peer *self, void *closure)
{
PyObject *ret;
switch(self->peer->id.type) {
case TGL_PEER_ENCR_CHAT:
ret = tgl_Peer_FromTglPeer(tgl_peer_get(TLS, TGL_MK_USER (self->peer->encr_chat.user_id)));
break;
case TGL_PEER_USER:
case TGL_PEER_CHAT:
PyErr_SetString(PyExc_TypeError, "Only peer.type == TGL_PEER_ENCR_CHAT has user");
Py_RETURN_NONE;
break;
default:
PyErr_SetString(PyExc_TypeError, "peer.type not supported!");
Py_RETURN_NONE;
}
Py_XINCREF(ret);
return ret;
}
static PyObject * static PyObject *
tgl_Peer_getid (tgl_Peer *self, void *closure) tgl_Peer_getid (tgl_Peer *self, void *closure)
@ -234,6 +256,7 @@ static PyGetSetDef tgl_Peer_getseters[] = {
{"type", (getter)tgl_Peer_gettype, NULL, "", NULL}, {"type", (getter)tgl_Peer_gettype, NULL, "", NULL},
{"name", (getter)tgl_Peer_getname, NULL, "", NULL}, {"name", (getter)tgl_Peer_getname, NULL, "", NULL},
{"user_id", (getter)tgl_Peer_getuser_id, NULL, "", NULL}, {"user_id", (getter)tgl_Peer_getuser_id, NULL, "", NULL},
{"user", (getter)tgl_Peer_getuser, NULL, "", NULL},
{"user_list", (getter)tgl_Peer_getuser_list, NULL, "", NULL}, {"user_list", (getter)tgl_Peer_getuser_list, NULL, "", NULL},
{"user_status", (getter)tgl_Peer_getuser_status, NULL, "", NULL}, {"user_status", (getter)tgl_Peer_getuser_status, NULL, "", NULL},
{"phone", (getter)tgl_Peer_getphone, NULL, "", NULL}, {"phone", (getter)tgl_Peer_getphone, NULL, "", NULL},
@ -417,7 +440,7 @@ tgl_Msg_getservice (tgl_Msg *self, void *closure)
static PyObject * static PyObject *
tgl_Msg_getfrom (tgl_Msg *self, void *closure) tgl_Msg_getsrc (tgl_Msg *self, void *closure)
{ {
PyObject *ret; PyObject *ret;
@ -432,7 +455,7 @@ tgl_Msg_getfrom (tgl_Msg *self, void *closure)
} }
static PyObject * static PyObject *
tgl_Msg_getto (tgl_Msg *self, void *closure) tgl_Msg_getdest (tgl_Msg *self, void *closure)
{ {
PyObject *ret; PyObject *ret;
@ -539,7 +562,7 @@ tgl_Msg_getdate (tgl_Msg *self, void *closure)
} }
static PyObject * static PyObject *
tgl_Msg_getfwd_from (tgl_Msg *self, void *closure) tgl_Msg_getfwd_src (tgl_Msg *self, void *closure)
{ {
PyObject *ret; PyObject *ret;
@ -614,12 +637,12 @@ static PyGetSetDef tgl_Msg_getseters[] = {
{"out", (getter)tgl_Msg_getout, NULL, "", NULL}, {"out", (getter)tgl_Msg_getout, NULL, "", NULL},
{"unread", (getter)tgl_Msg_getunread, NULL, "", NULL}, {"unread", (getter)tgl_Msg_getunread, NULL, "", NULL},
{"service", (getter)tgl_Msg_getservice, NULL, "", NULL}, {"service", (getter)tgl_Msg_getservice, NULL, "", NULL},
{"from", (getter)tgl_Msg_getfrom, NULL, "", NULL}, {"src", (getter)tgl_Msg_getsrc, NULL, "", NULL},
{"to", (getter)tgl_Msg_getto, NULL, "", NULL}, {"dest", (getter)tgl_Msg_getdest, NULL, "", NULL},
{"text", (getter)tgl_Msg_gettext, NULL, "", NULL}, {"text", (getter)tgl_Msg_gettext, NULL, "", NULL},
{"media", (getter)tgl_Msg_getmedia, NULL, "", NULL}, {"media", (getter)tgl_Msg_getmedia, NULL, "", NULL},
{"date", (getter)tgl_Msg_getdate, NULL, "", NULL}, {"date", (getter)tgl_Msg_getdate, NULL, "", NULL},
{"fwd_from", (getter)tgl_Msg_getfwd_from, NULL, "", NULL}, {"fwd_src", (getter)tgl_Msg_getfwd_src, NULL, "", NULL},
{"fwd_date", (getter)tgl_Msg_getfwd_date, NULL, "", NULL}, {"fwd_date", (getter)tgl_Msg_getfwd_date, NULL, "", NULL},
{"reply", (getter)tgl_Msg_getreply, NULL, "", NULL}, {"reply", (getter)tgl_Msg_getreply, NULL, "", NULL},
{"reply_id", (getter)tgl_Msg_getreply_id, NULL, "", NULL}, {"reply_id", (getter)tgl_Msg_getreply_id, NULL, "", NULL},
@ -637,7 +660,7 @@ static PyMethodDef tgl_Msg_methods[] = {
PyTypeObject tgl_MsgType = { PyTypeObject tgl_MsgType = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"tgl.Peer", /* tp_name */ "tgl.Msg", /* tp_name */
sizeof(tgl_Msg), /* tp_basicsize */ sizeof(tgl_Msg), /* tp_basicsize */
0, /* tp_itemsize */ 0, /* tp_itemsize */
(destructor)tgl_Msg_dealloc, /* tp_dealloc */ (destructor)tgl_Msg_dealloc, /* tp_dealloc */
@ -656,7 +679,7 @@ PyTypeObject tgl_MsgType = {
0, /* tp_setattro */ 0, /* tp_setattro */
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */ Py_TPFLAGS_DEFAULT, /* tp_flags */
"tgl Peer", /* tp_doc */ "tgl Message", /* tp_doc */
0, /* tp_traverse */ 0, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */

View File

@ -32,10 +32,10 @@ def history_cb(msg_list, ptype, pid, success, msgs):
tgl.get_history(ptype, pid, len(msg_list), HISTORY_QUERY_SIZE, partial(history_cb, msg_list, ptype, pid)); tgl.get_history(ptype, pid, len(msg_list), HISTORY_QUERY_SIZE, partial(history_cb, msg_list, ptype, pid));
def on_msg_receive(msg): def on_msg_receive(msg):
if msg["out"] and not binlog_done: if msg.out and not binlog_done:
return; return;
print(msg["to"].id) print("From: {0}, To: {1}".format(msg.src.id, msg.dest.user))
""" """
def on_msg_receive(msg): def on_msg_receive(msg):