vysheng / tg

telegram-cli
GNU General Public License v2.0
6.45k stars 1.53k forks source link

python support is broken in test branch #931

Open Cojad opened 8 years ago

Cojad commented 8 years ago

In test branch file configure is set to disable python even with option --enable-python set. and if I fix configure file then make will throw error msg below:

gcc -I. -I. -I./tgl -g -O2  -I/usr/local/include -I/usr/include -I/usr/include  -I/usr/local/include/python3.5m   -DHAVE_CONFIG_H -Wall -Werror -Wextra -Wno-missing-field-initializers -Wno-deprecated-declarations -fno-strict-aliasing -fno-omit-frame-pointer -ggdb -Wno-unused-parameter -fPIC -c -MP -MD -MF dep/interface.d -MQ objs/interface.o -o objs/interface.o interface.c
interface.c: In function ‘our_id_gw’:
interface.c:3090: error: incompatible type for argument 1 of ‘py_our_id’
python-tg.h:30: note: expected ‘int’ but argument is of type ‘tgl_peer_id_t’
make: *** [objs/interface.o] Error 1

I think this is due to id is no longer using int but tgl_peer_id_t. But I really have no idea how to correctly fix the code. I know test branch is more unstable but master branch is lack of supergroup support. So I have to use test branch.

JLarky commented 8 years ago

I was trying to fix it, but I don't know any C++, so I failed at it :) but this is where I started:

diff --git a/python-tg.c b/python-tg.c
index 09885f3..5354a26 100644
--- a/python-tg.c
+++ b/python-tg.c
@@ -82,6 +82,7 @@ extern PyTypeObject tgl_MsgType;
 //#include "interface.h"
 //#include "auto/constants.h"
 #include <tgl/tgl.h>
+#include <tgl/tgl-queries.h>
 #include "interface.h"

 #include <assert.h>
@@ -269,7 +270,7 @@ void py_diff_end (void) {
   Py_XDECREF(result);
 }

-void py_our_id (int id) {
+void py_our_id (tgl_peer_id_t id) {
   if (!python_loaded) { return; }

   PyObject *arglist, *result;
@@ -520,7 +521,8 @@ void py_contact_list_cb (struct tgl_state *TLSR, void *cb_extra, int success, in
   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[]) {
+void py_dialog_list_cb (struct tgl_state *TLSR, void *cb_extra, int success, int num, tgl_peer_id_t peers[], tgl_message_id_t *msgs[], int unread[]) {
+
   assert (TLSR == TLS);
   PyObject *callable = cb_extra;
   PyObject *arglist = NULL;
@@ -783,7 +785,7 @@ void py_do_all (void) {

     int len, len1, len2, len3;
     int limit, offset;
-    long msg_id = 0;
+    tgl_message_id_t *msg_id;

     PyObject *pyObj1 = NULL;
     PyObject *pyObj2 = NULL;
@@ -1264,7 +1266,7 @@ void py_add_action_enums(PyObject *m)
   PyModule_AddIntConstant(m, "ACTION_CHAT_EDIT_TITLE", tgl_message_action_chat_edit_title);
   PyModule_AddIntConstant(m, "ACTION_CHAT_EDIT_PHOTO", tgl_message_action_chat_edit_photo);
   PyModule_AddIntConstant(m, "ACTION_CHAT_DELETE_PHOTO", tgl_message_action_chat_delete_photo);
-  PyModule_AddIntConstant(m, "ACTION_CHAT_ADD_USER", tgl_message_action_chat_add_user);
+  PyModule_AddIntConstant(m, "ACTION_CHAT_ADD_USER", tgl_message_action_chat_add_users);
   PyModule_AddIntConstant(m, "ACTION_CHAT_ADD_USER_BY_LINK", tgl_message_action_chat_add_user_by_link);
   PyModule_AddIntConstant(m, "ACTION_CHAT_DELETE_USER", tgl_message_action_chat_delete_user);
   PyModule_AddIntConstant(m, "ACTION_SET_MESSAGE_TTL", tgl_message_action_set_message_ttl);
diff --git a/python-tg.h b/python-tg.h
index bc724ea..7540e52 100644
--- a/python-tg.h
+++ b/python-tg.h
@@ -27,7 +27,7 @@
 // Python functions
 void py_init (const char *file);
 void py_new_msg (struct tgl_message *M);
-void py_our_id (int id);
+void py_our_id (tgl_peer_id_t id);
 void py_secret_chat_update (struct tgl_secret_chat *U, unsigned flags);
 void py_user_update (struct tgl_user *U, unsigned flags);
 void py_chat_update (struct tgl_chat *C, unsigned flags);
diff --git a/python-types.c b/python-types.c
index da3cd5a..0907a6c 100644
--- a/python-types.c
+++ b/python-types.c
@@ -59,8 +59,8 @@ tgl_Peer_init(tgl_Peer *self, PyObject *args, PyObject *kwds)
   static char *kwlist[] = {"type", "id", NULL};
   tgl_peer_id_t peer_id;
   if(!PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwlist,
-                                  &peer_id.type,
-                                  &peer_id.id))
+                                  &peer_id.peer_type,
+                                  &peer_id.peer_id))
   {
     PyErr_Format(PeerError, "Peer must specify type and id");
     return -1;
@@ -77,7 +77,7 @@ tgl_Peer_getname (tgl_Peer *self, void *closure)
 {
   PyObject *ret;

-  switch(self->peer->id.type) {
+  switch(self->peer->id.peer_type) {
     case TGL_PEER_USER:
       ret = PyUnicode_FromString(self->peer->user.print_name);
       break;
@@ -102,9 +102,9 @@ tgl_Peer_getuser_id (tgl_Peer *self, void *closure)
 {
   PyObject *ret;

-  switch(self->peer->id.type) {
+  switch(self->peer->id.peer_type) {
     case TGL_PEER_USER:
-      ret = PyLong_FromLong(self->peer->id.id);
+      ret = PyLong_FromLong(self->peer->id.peer_id);
       break;
     case TGL_PEER_CHAT:
       PyErr_SetString(PeerError, "peer.type_name == 'chat' has no user_id");
@@ -130,7 +130,7 @@ tgl_Peer_getuser_list (tgl_Peer *self, void *closure)
   int i;
   struct tgl_chat_user *user_list;

-  switch(self->peer->id.type) {
+  switch(self->peer->id.peer_type) {
     case TGL_PEER_CHAT:
       ret = PyList_New(0);
         for(i = 0; i < self->peer->chat.user_list_size; i++) {
@@ -158,7 +158,7 @@ tgl_Peer_getuser_status(tgl_Peer *self, void *closure)
 {
   PyObject *ret;

-  switch(self->peer->id.type) {
+  switch(self->peer->id.peer_type) {
     case TGL_PEER_USER:
       ret = PyDict_New();
       PyDict_SetItemString(ret, "online", self->peer->user.status.online? Py_True : Py_False);
@@ -184,7 +184,7 @@ tgl_Peer_getphone (tgl_Peer *self, void *closure)
 {
   PyObject *ret;

-  switch(self->peer->id.type) {
+  switch(self->peer->id.peer_type) {
     case TGL_PEER_USER:
       if(self->peer->user.phone)
         ret = PyUnicode_FromString(self->peer->user.phone);
@@ -210,7 +210,7 @@ tgl_Peer_getusername (tgl_Peer *self, void *closure)
 {
   PyObject *ret;

-  switch(self->peer->id.type) {
+  switch(self->peer->id.peer_type) {
     case TGL_PEER_USER:
       if(self->peer->user.username)
         ret = PyUnicode_FromString(self->peer->user.username);
@@ -236,7 +236,7 @@ tgl_Peer_getfirst_name (tgl_Peer *self, void *closure)
 {
   PyObject *ret;

-  switch(self->peer->id.type) {
+  switch(self->peer->id.peer_type) {
     case TGL_PEER_USER:
       if(self->peer->user.first_name)
         ret = PyUnicode_FromString(self->peer->user.first_name);
@@ -262,7 +262,7 @@ tgl_Peer_getlast_name (tgl_Peer *self, void *closure)
 {
   PyObject *ret;

-  switch(self->peer->id.type) {
+  switch(self->peer->id.peer_type) {
     case TGL_PEER_USER:
       if(self->peer->user.last_name)
         ret = PyUnicode_FromString(self->peer->user.last_name);
@@ -288,7 +288,7 @@ tgl_Peer_getuser (tgl_Peer *self, void *closure)
 {
   PyObject *ret;

-  switch(self->peer->id.type) {
+  switch(self->peer->id.peer_type) {
     case TGL_PEER_ENCR_CHAT:
       ret = tgl_Peer_FromTglPeer(tgl_peer_get(TLS, TGL_MK_USER (self->peer->encr_chat.user_id)));
       break;
@@ -313,7 +313,7 @@ tgl_Peer_gettype_name(tgl_Peer* self)
 {
   PyObject *name;

-  switch(self->peer->id.type) {
+  switch(self->peer->id.peer_type) {
     case TGL_PEER_USER:
       name = PyUnicode_FromString("user");
       break;
@@ -334,7 +334,7 @@ tgl_Peer_getid (tgl_Peer *self, void *closure)
 {
   PyObject *ret;

-  ret = PyLong_FromLong(self->peer->id.id);
+  ret = PyLong_FromLong(self->peer->id.peer_id);

   Py_XINCREF(ret);
   return ret;
@@ -345,7 +345,7 @@ tgl_Peer_gettype (tgl_Peer *self, void *closure)
 {
   PyObject *ret;

-  ret = PyLong_FromLong(self->peer->id.type); 
+  ret = PyLong_FromLong(self->peer->id.peer_type);

   Py_XINCREF(ret);
   return ret;
@@ -496,7 +496,7 @@ tgl_Peer_rename_chat (tgl_Peer *self, PyObject *args, PyObject *kwargs)
   char * title;
   PyObject *callback = NULL;

-  if(self->peer->id.type != TGL_PEER_CHAT) {
+  if(self->peer->id.peer_type != TGL_PEER_CHAT) {
     PyErr_SetString(PeerError, "Only a chat peer can be renamed");
     Py_XINCREF(Py_False);
     return Py_False;
@@ -698,7 +698,7 @@ tgl_Peer_chat_set_photo (tgl_Peer *self, PyObject *args, PyObject *kwargs)
   char * filename;
   PyObject *callback = NULL;

-  if(self->peer->id.type != TGL_PEER_CHAT) {
+  if(self->peer->id.peer_type != TGL_PEER_CHAT) {
     PyErr_SetString(PeerError, "Only a chat peer can have a chat photo set.");
     Py_XINCREF(Py_False);
     return Py_False;
@@ -732,7 +732,7 @@ tgl_Peer_chat_add_user (tgl_Peer *self, PyObject *args, PyObject *kwargs)
   PyObject *peer;
   PyObject *callback = NULL;

-  if(self->peer->id.type != TGL_PEER_CHAT) {
+  if(self->peer->id.peer_type != TGL_PEER_CHAT) {
     PyErr_SetString(PeerError, "Only a chat peer can have a user added.");
     Py_XINCREF(Py_False);
     return Py_False;
@@ -766,7 +766,7 @@ tgl_Peer_chat_del_user (tgl_Peer *self, PyObject *args, PyObject *kwargs)
   PyObject *peer;
   PyObject *callback = NULL;

-  if(self->peer->id.type != TGL_PEER_CHAT) {
+  if(self->peer->id.peer_type != TGL_PEER_CHAT) {
     PyErr_SetString(PeerError, "Only a chat peer can have a user deleted.");
     Py_XINCREF(Py_False);
     return Py_False;
@@ -827,7 +827,7 @@ tgl_Peer_info (tgl_Peer *self, PyObject *args, PyObject *kwargs)

   PyObject *callback = NULL;

-  if(self->peer->id.type == TGL_PEER_ENCR_CHAT) {
+  if(self->peer->id.peer_type == TGL_PEER_ENCR_CHAT) {
     PyErr_SetString(PeerError, "Secret chats currently have no info.");
     Py_XINCREF(Py_False);
     return Py_False;
@@ -843,7 +843,7 @@ tgl_Peer_info (tgl_Peer *self, PyObject *args, PyObject *kwargs)

     Py_INCREF(Py_None);
     Py_XINCREF(api_call);
-    if(self->peer->id.type == TGL_PEER_USER)
+    if(self->peer->id.peer_type == TGL_PEER_USER)
       return py_user_info(Py_None, api_call);
     else
       return py_chat_info(Py_None, api_call);
@@ -970,13 +970,13 @@ tgl_Peer_repr(tgl_Peer *self)
 {
   PyObject *ret;

-  switch(self->peer->id.type) {
+  switch(self->peer->id.peer_type) {
     case TGL_PEER_USER:
 #if PY_VERSION_HEX < 0x02070900
-       ret = PyUnicode_FromFormat("<tgl.Peer: id=%ld>", self->peer->id.id);
+       ret = PyUnicode_FromFormat("<tgl.Peer: id=%ld>", self->peer->id.peer_id);
 #else
        ret = PyUnicode_FromFormat("<tgl.Peer: type=user, id=%ld, username=%R, name=%R, first_name=%R, last_name=%R, phone=%R>",
-                                  self->peer->id.id,
+                                  self->peer->id.peer_id,
                                   PyObject_GetAttrString((PyObject*)self, "username"),
                                   PyObject_GetAttrString((PyObject*)self, "name"),
                                   PyObject_GetAttrString((PyObject*)self, "first_name"),
@@ -987,11 +987,11 @@ tgl_Peer_repr(tgl_Peer *self)
       break;
     case TGL_PEER_CHAT:
       ret = PyUnicode_FromFormat("<tgl.Peer: type=chat, id=%ld, name=%s>",
-                                  self->peer->id.id,  self->peer->chat.print_title);
+                                  self->peer->id.peer_id,  self->peer->chat.print_title);
       break;
     case TGL_PEER_ENCR_CHAT:
       ret = PyUnicode_FromFormat("<tgl.Peer: type=secret_chat, id=%ld, name=%s, user=%R>",
-                                  self->peer->id.id,  self->peer->encr_chat.print_name,
+                                  self->peer->id.peer_id,  self->peer->encr_chat.print_name,
                                   PyObject_GetAttrString((PyObject*)self, "user"));
       break;
     default:
@@ -1021,10 +1021,10 @@ tgl_Peer_RichCompare(PyObject *self, PyObject *other, int cmp)
     } else {
       switch (cmp) {
       case Py_EQ:
-        result = ((tgl_Peer*)self)->peer->id.id == ((tgl_Peer*)other)->peer->id.id ? Py_True : Py_False;
+        result = ((tgl_Peer*)self)->peer->id.peer_id == ((tgl_Peer*)other)->peer->id.peer_id ? Py_True : Py_False;
         break;
       case Py_NE:
-        result = ((tgl_Peer*)self)->peer->id.id == ((tgl_Peer*)other)->peer->id.id ? Py_False : Py_True;
+        result = ((tgl_Peer*)self)->peer->id.peer_id == ((tgl_Peer*)other)->peer->id.peer_id ? Py_False : Py_True;
         break;
       case Py_LE:
       case Py_GE:
@@ -1122,7 +1122,7 @@ tgl_Msg_getid (tgl_Msg *self, void *closure)
 {
   PyObject *ret;

-  ret = PyLong_FromLong(self->msg->id);
+  ret = PyLong_FromLong(self->msg->permanent_id);

   Py_XINCREF(ret);
   return ret;
@@ -1456,11 +1456,11 @@ tgl_Msg_repr(tgl_Msg *self)
 {
   PyObject *ret;
 #if PY_VERSION_HEX < 0x02070900
-  ret = PyUnicode_FromFormat("<tgl.Msg id=%ld>", self->msg->id);
+  ret = PyUnicode_FromFormat("<tgl.Msg id=%ld>", self->msg->permanent_id);
 #else
   ret = PyUnicode_FromFormat("<tgl.Msg id=%ld, flags=%d, mention=%R, out=%R, unread=%R, service=%R, src=%R, "
                              "dest=%R, text=%R, media=%R, date=%R, fwd_src=%R, fwd_date=%R, reply_id=%R, reply=%R>",
-                             self->msg->id, self->msg->flags,
+                             self->msg->permanent_id, self->msg->flags,
                              PyObject_GetAttrString((PyObject*)self, "mention"),
                              PyObject_GetAttrString((PyObject*)self, "out"),
                              PyObject_GetAttrString((PyObject*)self, "unread"),
avineha commented 8 years ago

Hi,

Its not working for me, i am facing below issue.

gcc -I. -I. -I./tgl -g -O2 -I/usr/local/include -I/usr/include -I/usr/include -I/usr/include/python3.4m -DHAVE_CONFIG_H -Wall -Werror -Wextra -Wno-missing-field-initializers -Wno-deprecated-declarations -fno-strict-aliasing -fno-omit-frame-pointer -ggdb -Wno-unused-parameter -fPIC -c -MP -MD -MF dep/interface.d -MQ objs/interface.o -o objs/interface.o interface.c interface.c: In function ‘our_id_gw’: interface.c:3090:5: error: incompatible type for argument 1 of ‘py_our_id’ py_our_id (id); ^ In file included from interface.c:25:0: python-tg.h:30:6: note: expected ‘int’ but argument is of type ‘tgl_peer_id_t’ void py_our_id (int id); ^ Makefile:48: recipe for target 'objs/interface.o' failed make: *\ [objs/interface.o] Error 1

Please do needful help

Cojad commented 8 years ago

https://github.com/vysheng/tg/pull/1137 I have somehow manage to fix part of python support with this patch. there are still things left broken. So I welcome for any suggestion.