@@ -20,6 +20,14 @@ extern PyObject *TglError;
20
20
extern PyObject * PeerError ;
21
21
extern PyObject * MsgError ;
22
22
23
+
24
+ // Utility functions
25
+ PyObject * get_datetime (long datetime )
26
+ {
27
+ return PyDateTime_FromTimestamp (Py_BuildValue ("(O)" , PyLong_FromLong (datetime )));
28
+ }
29
+
30
+
23
31
//
24
32
// tgl_peer_t wrapper
25
33
//
@@ -34,6 +42,7 @@ tgl_Peer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
34
42
{
35
43
tgl_Peer * self ;
36
44
45
+ PyDateTime_IMPORT ;
37
46
self = (tgl_Peer * )type -> tp_alloc (type , 0 );
38
47
return (PyObject * )self ;
39
48
}
@@ -148,8 +157,7 @@ tgl_Peer_getuser_status(tgl_Peer *self, void *closure)
148
157
case TGL_PEER_USER :
149
158
ret = PyDict_New ();
150
159
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 ));
153
161
154
162
break ;
155
163
case TGL_PEER_CHAT :
@@ -173,7 +181,10 @@ tgl_Peer_getphone (tgl_Peer *self, void *closure)
173
181
174
182
switch (self -> peer -> id .type ) {
175
183
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 ;
177
188
break ;
178
189
case TGL_PEER_CHAT :
179
190
case TGL_PEER_ENCR_CHAT :
@@ -196,7 +207,10 @@ tgl_Peer_getusername (tgl_Peer *self, void *closure)
196
207
197
208
switch (self -> peer -> id .type ) {
198
209
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 ;
200
214
break ;
201
215
case TGL_PEER_CHAT :
202
216
case TGL_PEER_ENCR_CHAT :
@@ -219,7 +233,10 @@ tgl_Peer_getfirst_name (tgl_Peer *self, void *closure)
219
233
220
234
switch (self -> peer -> id .type ) {
221
235
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 ;
223
240
break ;
224
241
case TGL_PEER_CHAT :
225
242
case TGL_PEER_ENCR_CHAT :
@@ -242,7 +259,10 @@ tgl_Peer_getlast_name (tgl_Peer *self, void *closure)
242
259
243
260
switch (self -> peer -> id .type ) {
244
261
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 ;
246
266
break ;
247
267
case TGL_PEER_CHAT :
248
268
case TGL_PEER_ENCR_CHAT :
@@ -381,6 +401,39 @@ static PyMethodDef tgl_Peer_methods[] = {
381
401
};
382
402
383
403
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
+
384
437
PyTypeObject tgl_PeerType = {
385
438
PyVarObject_HEAD_INIT (NULL , 0 )
386
439
"tgl.Peer" , /* tp_name */
@@ -391,7 +444,7 @@ PyTypeObject tgl_PeerType = {
391
444
0 , /* tp_getattr */
392
445
0 , /* tp_setattr */
393
446
0 , /* tp_reserved */
394
- 0 , /* tp_repr */
447
+ ( reprfunc ) tgl_Peer_repr , /* tp_repr */
395
448
0 , /* tp_as_number */
396
449
0 , /* tp_as_sequence */
397
450
0 , /* tp_as_mapping */
@@ -446,6 +499,7 @@ tgl_Msg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
446
499
{
447
500
tgl_Msg * self ;
448
501
502
+ PyDateTime_IMPORT ;
449
503
self = (tgl_Msg * )type -> tp_alloc (type , 0 );
450
504
return (PyObject * )self ;
451
505
}
@@ -636,8 +690,7 @@ tgl_Msg_getdate (tgl_Msg *self, void *closure)
636
690
PyObject * ret ;
637
691
638
692
if (self -> msg -> date ) {
639
- ret = PyDateTime_FromTimestamp (Py_BuildValue ("(O)" ,
640
- PyLong_FromLong (self -> msg -> date )));
693
+ ret = get_datetime (self -> msg -> date );
641
694
} else {
642
695
Py_RETURN_NONE ;
643
696
}
@@ -667,8 +720,7 @@ tgl_Msg_getfwd_date (tgl_Msg *self, void *closure)
667
720
PyObject * ret ;
668
721
669
722
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 );
672
724
} else {
673
725
Py_RETURN_NONE ;
674
726
}
@@ -712,7 +764,31 @@ tgl_Msg_getreply_id (tgl_Msg *self, void *closure)
712
764
return ret ;
713
765
}
714
766
767
+ static PyObject *
768
+ tgl_Msg_repr (tgl_Msg * self )
769
+ {
770
+ PyObject * ret ;
715
771
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
+ }
716
792
717
793
718
794
static PyGetSetDef tgl_Msg_getseters [] = {
@@ -753,7 +829,7 @@ PyTypeObject tgl_MsgType = {
753
829
0 , /* tp_getattr */
754
830
0 , /* tp_setattr */
755
831
0 , /* tp_reserved */
756
- 0 , /* tp_repr */
832
+ ( reprfunc ) tgl_Msg_repr , /* tp_repr */
757
833
0 , /* tp_as_number */
758
834
0 , /* tp_as_sequence */
759
835
0 , /* tp_as_mapping */
@@ -764,7 +840,7 @@ PyTypeObject tgl_MsgType = {
764
840
0 , /* tp_setattro */
765
841
0 , /* tp_as_buffer */
766
842
Py_TPFLAGS_DEFAULT , /* tp_flags */
767
- "tgl Message" , /* tp_doc */
843
+ "tgl Message" , /* tp_doc */
768
844
0 , /* tp_traverse */
769
845
0 , /* tp_clear */
770
846
0 , /* tp_richcompare */
0 commit comments