Skip to content

Commit 354aa64

Browse files
committed
Implement reprs and fix dates
1 parent b547ca7 commit 354aa64

File tree

3 files changed

+90
-19
lines changed

3 files changed

+90
-19
lines changed

‎python-tg.c

-6
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,6 @@ PyObject *_py_chat_update;
109109

110110
PyObject* get_peer (tgl_peer_id_t id, tgl_peer_t *P);
111111

112-
// Utility functions
113-
PyObject* get_datetime(long datetime)
114-
{
115-
return PyDateTime_FromTimestamp(Py_BuildValue("(O)", PyLong_FromLong(datetime)));
116-
}
117-
118112
void py_add_string_field (PyObject* dict, char *name, const char *value) {
119113
assert (PyDict_Check(dict));
120114
assert (name && strlen (name));

‎python-types.c

+89-13
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ extern PyObject *TglError;
2020
extern PyObject *PeerError;
2121
extern PyObject *MsgError;
2222

23+
24+
// Utility functions
25+
PyObject* get_datetime(long datetime)
26+
{
27+
return PyDateTime_FromTimestamp(Py_BuildValue("(O)", PyLong_FromLong(datetime)));
28+
}
29+
30+
2331
//
2432
// tgl_peer_t wrapper
2533
//
@@ -34,6 +42,7 @@ tgl_Peer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3442
{
3543
tgl_Peer *self;
3644

45+
PyDateTime_IMPORT;
3746
self = (tgl_Peer *)type->tp_alloc(type, 0);
3847
return (PyObject *)self;
3948
}
@@ -148,8 +157,7 @@ tgl_Peer_getuser_status(tgl_Peer *self, void *closure)
148157
case TGL_PEER_USER:
149158
ret = PyDict_New();
150159
PyDict_SetItemString(ret, "online", self->peer->user.status.online? Py_True : Py_False);
151-
PyDict_SetItemString(ret, "when", PyDateTime_FromTimestamp(Py_BuildValue("(O)",
152-
PyLong_FromLong(self->peer->user.status.when))));
160+
PyDict_SetItemString(ret, "when", get_datetime(self->peer->user.status.when));
153161

154162
break;
155163
case TGL_PEER_CHAT:
@@ -173,7 +181,10 @@ tgl_Peer_getphone (tgl_Peer *self, void *closure)
173181

174182
switch(self->peer->id.type) {
175183
case TGL_PEER_USER:
176-
ret = PyUnicode_FromString(self->peer->user.phone);
184+
if(self->peer->user.phone)
185+
ret = PyUnicode_FromString(self->peer->user.phone);
186+
else
187+
Py_RETURN_NONE;
177188
break;
178189
case TGL_PEER_CHAT:
179190
case TGL_PEER_ENCR_CHAT:
@@ -196,7 +207,10 @@ tgl_Peer_getusername (tgl_Peer *self, void *closure)
196207

197208
switch(self->peer->id.type) {
198209
case TGL_PEER_USER:
199-
ret = PyUnicode_FromString(self->peer->user.username);
210+
if(self->peer->user.username)
211+
ret = PyUnicode_FromString(self->peer->user.username);
212+
else
213+
Py_RETURN_NONE;
200214
break;
201215
case TGL_PEER_CHAT:
202216
case TGL_PEER_ENCR_CHAT:
@@ -219,7 +233,10 @@ tgl_Peer_getfirst_name (tgl_Peer *self, void *closure)
219233

220234
switch(self->peer->id.type) {
221235
case TGL_PEER_USER:
222-
ret = PyUnicode_FromString(self->peer->user.first_name);
236+
if(self->peer->user.first_name)
237+
ret = PyUnicode_FromString(self->peer->user.first_name);
238+
else
239+
Py_RETURN_NONE;
223240
break;
224241
case TGL_PEER_CHAT:
225242
case TGL_PEER_ENCR_CHAT:
@@ -242,7 +259,10 @@ tgl_Peer_getlast_name (tgl_Peer *self, void *closure)
242259

243260
switch(self->peer->id.type) {
244261
case TGL_PEER_USER:
245-
ret = PyUnicode_FromString(self->peer->user.username);
262+
if(self->peer->user.last_name)
263+
ret = PyUnicode_FromString(self->peer->user.last_name);
264+
else
265+
Py_RETURN_NONE;
246266
break;
247267
case TGL_PEER_CHAT:
248268
case TGL_PEER_ENCR_CHAT:
@@ -381,6 +401,39 @@ static PyMethodDef tgl_Peer_methods[] = {
381401
};
382402

383403

404+
static PyObject *
405+
tgl_Peer_repr(tgl_Peer *self)
406+
{
407+
PyObject *ret;
408+
409+
switch(self->peer->id.type) {
410+
case TGL_PEER_USER:
411+
ret = PyUnicode_FromFormat("<tgl.Peer: type=user, id=%ld, username=%R, name=%R, first_name=%R, last_name=%R, phone=%R>",
412+
self->peer->id.id,
413+
PyObject_GetAttrString((PyObject*)self, "username"),
414+
PyObject_GetAttrString((PyObject*)self, "name"),
415+
PyObject_GetAttrString((PyObject*)self, "first_name"),
416+
PyObject_GetAttrString((PyObject*)self, "last_name"),
417+
PyObject_GetAttrString((PyObject*)self, "phone")
418+
);
419+
break;
420+
case TGL_PEER_CHAT:
421+
ret = PyUnicode_FromFormat("<tgl.Peer: type=chat, id=%ld, name=%s>",
422+
self->peer->id.id, self->peer->chat.print_title);
423+
break;
424+
case TGL_PEER_ENCR_CHAT:
425+
ret = PyUnicode_FromFormat("<tgl.Peer: type=secret_chat, id=%ld, name=%s, user=%R>",
426+
self->peer->id.id, self->peer->encr_chat.print_name,
427+
PyObject_GetAttrString((PyObject*)self, "user"));
428+
break;
429+
default:
430+
ret = PyUnicode_FromFormat("<tgl.Peer: Type Unknown>");
431+
}
432+
433+
return ret;
434+
}
435+
436+
384437
PyTypeObject tgl_PeerType = {
385438
PyVarObject_HEAD_INIT(NULL, 0)
386439
"tgl.Peer", /* tp_name */
@@ -391,7 +444,7 @@ PyTypeObject tgl_PeerType = {
391444
0, /* tp_getattr */
392445
0, /* tp_setattr */
393446
0, /* tp_reserved */
394-
0, /* tp_repr */
447+
(reprfunc)tgl_Peer_repr, /* tp_repr */
395448
0, /* tp_as_number */
396449
0, /* tp_as_sequence */
397450
0, /* tp_as_mapping */
@@ -446,6 +499,7 @@ tgl_Msg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
446499
{
447500
tgl_Msg *self;
448501

502+
PyDateTime_IMPORT;
449503
self = (tgl_Msg *)type->tp_alloc(type, 0);
450504
return (PyObject *)self;
451505
}
@@ -636,8 +690,7 @@ tgl_Msg_getdate (tgl_Msg *self, void *closure)
636690
PyObject *ret;
637691

638692
if(self->msg->date) {
639-
ret = PyDateTime_FromTimestamp(Py_BuildValue("(O)",
640-
PyLong_FromLong(self->msg->date)));
693+
ret = get_datetime(self->msg->date);
641694
} else {
642695
Py_RETURN_NONE;
643696
}
@@ -667,8 +720,7 @@ tgl_Msg_getfwd_date (tgl_Msg *self, void *closure)
667720
PyObject *ret;
668721

669722
if(tgl_get_peer_type (self->msg->fwd_from_id)) {
670-
ret = PyDateTime_FromTimestamp(Py_BuildValue("(O)",
671-
PyLong_FromLong(self->msg->fwd_date)));
723+
ret = get_datetime(self->msg->fwd_date);
672724
} else {
673725
Py_RETURN_NONE;
674726
}
@@ -712,7 +764,31 @@ tgl_Msg_getreply_id (tgl_Msg *self, void *closure)
712764
return ret;
713765
}
714766

767+
static PyObject *
768+
tgl_Msg_repr(tgl_Msg *self)
769+
{
770+
PyObject *ret;
715771

772+
ret = PyUnicode_FromFormat("<tgl.Msg id=%ld, flags=%d, mention=%R, out=%R, unread=%R, service=%R, src=%R, "
773+
"dest=%R, text=%R, media=%R, date=%R, fwd_src=%R, fwd_date=%R, reply_id=%R, reply=%R>",
774+
self->msg->id, self->msg->flags,
775+
PyObject_GetAttrString((PyObject*)self, "mention"),
776+
PyObject_GetAttrString((PyObject*)self, "out"),
777+
PyObject_GetAttrString((PyObject*)self, "unread"),
778+
PyObject_GetAttrString((PyObject*)self, "service"),
779+
PyObject_GetAttrString((PyObject*)self, "src"),
780+
PyObject_GetAttrString((PyObject*)self, "dest"),
781+
PyObject_GetAttrString((PyObject*)self, "text"),
782+
PyObject_GetAttrString((PyObject*)self, "media"),
783+
PyObject_GetAttrString((PyObject*)self, "date"),
784+
PyObject_GetAttrString((PyObject*)self, "fwd_src"),
785+
PyObject_GetAttrString((PyObject*)self, "fwd_date"),
786+
PyObject_GetAttrString((PyObject*)self, "reply_id"),
787+
PyObject_GetAttrString((PyObject*)self, "reply")
788+
);
789+
790+
return ret;
791+
}
716792

717793

718794
static PyGetSetDef tgl_Msg_getseters[] = {
@@ -753,7 +829,7 @@ PyTypeObject tgl_MsgType = {
753829
0, /* tp_getattr */
754830
0, /* tp_setattr */
755831
0, /* tp_reserved */
756-
0, /* tp_repr */
832+
(reprfunc)tgl_Msg_repr, /* tp_repr */
757833
0, /* tp_as_number */
758834
0, /* tp_as_sequence */
759835
0, /* tp_as_mapping */
@@ -764,7 +840,7 @@ PyTypeObject tgl_MsgType = {
764840
0, /* tp_setattro */
765841
0, /* tp_as_buffer */
766842
Py_TPFLAGS_DEFAULT, /* tp_flags */
767-
"tgl Message", /* tp_doc */
843+
"tgl Message", /* tp_doc */
768844
0, /* tp_traverse */
769845
0, /* tp_clear */
770846
0, /* tp_richcompare */

‎tg-test.py

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def on_msg_receive(msg):
4242
else: # chatroom
4343
peer = msg.dest
4444

45+
print(msg)
4546
if msg.text.startswith("!ping"):
4647
print("SENDING PONG")
4748
tgl.send_msg(peer, "PONG!", msg_cb)

0 commit comments

Comments
 (0)