diff --git a/README.md b/README.md index a807151..2d61671 100644 --- a/README.md +++ b/README.md @@ -84,8 +84,9 @@ Others include: * Cython bindings. Incomplete and not really actively supported. Maybe it will get worked on in the future, but TokTok seems to be working on - java, go, etc. bindings instead. Based on a homebrew generator written - in undocumented, uncommented code in a language almost nobody knows, or has. + java, go, etc. bindings instead. The code is based on a homebrew generator written + in undocumented, uncommented code in a language almost nobody knows, or has + by an anonymous team that is not open to suggestions. No support for NGC groups; no significant tests. * @@ -93,7 +94,9 @@ Others include: by Wei-Ning Huang . Hardcore C wrapping which is not easy to keep up to date. No support for NGC but good tests. Abandonned. - This was the basis for the TokTok/py-toxcore-c code until recently. + This was the basis for the TokTok/py-toxcore-c code until recently, + and a version is on the 0.2.0 branch of + [TokTok/py-toxcore-c](https://github.com/TokTok/py-toxcore-c) To our point of view, the ability of CTYPEs to follow code in the debugger is a crucial advantage. @@ -107,7 +110,7 @@ does hostname lookups before calling Tox (like toxygen does). Otherwise, do not use it for anonymous communication unless you have a firewall in place. The Tox project does not follow semantic versioning of its main structures -so the project may break the underlying ctypes wrapper at any time; +or setters so the project may break the underlying ctypes wrapper at any time; it's not possible to use Tox version numbers to tell what the API will be. In which case you'll have to go into the tox.py file in https://git.plastiras.org/emdee/toxygen_wrapper to fix it yourself. diff --git a/docs/c-toxcore.missing b/docs/c-toxcore.missing new file mode 100644 index 0000000..f5cb844 --- /dev/null +++ b/docs/c-toxcore.missing @@ -0,0 +1,116 @@ +tox_callback_conference_connected +tox_callback_conference_invite +tox_callback_conference_message +tox_callback_conference_peer_list_changed +tox_callback_conference_peer_name +tox_callback_conference_title +tox_callback_group_custom_private_packet +tox_conference_by_id +tox_conference_by_uid +tox_conference_delete +tox_conference_get_chatlist +tox_conference_get_chatlist_size +tox_conference_get_id +tox_conference_get_title +tox_conference_get_title_size +tox_conference_get_type +tox_conference_get_uid +tox_conference_id_size +tox_conference_invite +tox_conference_join +tox_conference_new +tox_conference_offline_peer_count +tox_conference_offline_peer_get_last_active +tox_conference_offline_peer_get_name +tox_conference_offline_peer_get_name_size +tox_conference_offline_peer_get_public_key +tox_conference_peer_count +tox_conference_peer_get_name +tox_conference_peer_get_name_size +tox_conference_peer_get_public_key +tox_conference_peer_number_is_ours +tox_conference_send_message +tox_conference_set_max_offline +tox_conference_set_title +tox_conference_uid_size +tox_file_seek +tox_get_salt +tox_group_send_custom_private_packet +tox_is_data_encrypted +tox_options_get_dht_announcements_enabled +tox_options_get_end_port +tox_options_get_experimental_groups_persistence +tox_options_get_experimental_thread_safety +tox_options_get_hole_punching_enabled +tox_options_get_ipv6_enabled +tox_options_get_local_discovery_enabled +tox_options_get_log_callback +tox_options_get_log_user_data +tox_options_get_operating_system +tox_options_get_proxy_host +tox_options_get_proxy_port +tox_options_get_proxy_type +tox_options_get_savedata_data +tox_options_get_savedata_length +tox_options_get_savedata_type +tox_options_get_start_port +tox_options_get_tcp_port +tox_options_get_udp_enabled +tox_options_set_dht_announcements_enabled +tox_options_set_end_port +tox_options_set_experimental_groups_persistence +tox_options_set_experimental_thread_safety +tox_options_set_hole_punching_enabled +tox_options_set_ipv6_enabled +tox_options_set_local_discovery_enabled +tox_options_set_log_callback +tox_options_set_log_user_data +tox_options_set_operating_system +tox_options_set_proxy_host +tox_options_set_proxy_port +tox_options_set_proxy_type +tox_options_set_savedata_data +tox_options_set_savedata_length +tox_options_set_savedata_type +tox_options_set_start_port +tox_options_set_tcp_port +tox_options_set_udp_enabled +tox_pass_decrypt +tox_pass_encrypt +tox_pass_encryption_extra_length +tox_pass_key_decrypt +tox_pass_key_derive +tox_pass_key_derive_with_salt +tox_pass_key_encrypt +tox_pass_key_free +tox_pass_key_length +tox_pass_salt_length +tox_version_is_compatible +toxav_add_av_groupchat +toxav_answer +toxav_audio_iterate +toxav_audio_iteration_interval +toxav_audio_send_frame +toxav_audio_set_bit_rate +toxav_call +toxav_call_control +toxav_callback_audio_bit_rate +toxav_callback_audio_receive_frame +toxav_callback_call +toxav_callback_call_state +toxav_callback_video_bit_rate +toxav_callback_video_receive_frame +toxav_get_tox +toxav_group_send_audio +toxav_groupchat_av_enabled +toxav_groupchat_disable_av +toxav_groupchat_enable_av +toxav_iterate +toxav_iteration_interval +toxav_join_av_groupchat +toxav_kill +toxav_new +toxav_video_iterate +toxav_video_iteration_interval +toxav_video_send_frame +toxav_video_set_bit_rate diff --git a/src/toxygen_wrapper/tests/tests_wrapper.py b/src/toxygen_wrapper/tests/tests_wrapper.py index d94d76f..5174ab5 100644 --- a/src/toxygen_wrapper/tests/tests_wrapper.py +++ b/src/toxygen_wrapper/tests/tests_wrapper.py @@ -888,7 +888,11 @@ class ToxSuite(unittest.TestCase, WrapperMixin): t:group_is_connected t:group_leave t:group_mod_set_role + + t:group_get_topic_lock """ + # group_mod_set_role + iGrp = self.otox_test_groups(self.bob) LOG.info(f"test_groups iGrp={iGrp}") if iGrp >= 0: diff --git a/src/toxygen_wrapper/tests/wrapper_mixin.py b/src/toxygen_wrapper/tests/wrapper_mixin.py index 82766db..6528a97 100644 --- a/src/toxygen_wrapper/tests/wrapper_mixin.py +++ b/src/toxygen_wrapper/tests/wrapper_mixin.py @@ -523,9 +523,12 @@ class WrapperMixin(): assert otox.group_get_name_size(iGrp) == len(group_name) sPk = otox.group_self_get_public_key(iGrp) + i = otox.group_get_password_size(iGrp) assert otox.group_get_password_size(iGrp) >= 0 sP = otox.group_get_password(iGrp) + assert len(sP) == i, sP assert otox.group_get_privacy_state(iGrp) == privacy_state + i = otox.tox_group_get_topic_lock(iGrp) assert otox.group_get_number_groups() > 0, "numg={otox.group_get_number_groups()}" LOG.info(f"group pK={sPk} iGrp={iGrp} numg={otox.group_get_number_groups()}") diff --git a/src/toxygen_wrapper/tox.py b/src/toxygen_wrapper/tox.py index e86af97..1891aa2 100644 --- a/src/toxygen_wrapper/tox.py +++ b/src/toxygen_wrapper/tox.py @@ -2975,6 +2975,22 @@ s raise ToxError(f"group_get_password err={error.value}") return str(bytearray(password[:size]), 'utf-8', errors='ignore') + def tox_group_get_topic_lock(self, group_number: int) -> int: + """ + """ + if group_number < 0: + raise ToxError(f"tox_group_ group_number < 0 {group_number}") + + error = c_int() + LOG_DEBUG(f"tox.tox_group_get_topic_lock") + result = Tox.libtoxcore.tox_group_get_topic_lock(self._tox_pointer, + c_uint(group_number), + byref(error)) + if error.value: + LOG_ERROR(f"tox_group_get_topic_lock err={error.value}") + raise ToxError(f"tox_group_get_topic_lock err={error.value}") + return int(result) + def callback_group_topic(self, callback: Optional[Callable], user_data: Optional[bytes] = None) -> None: """ Set the callback for the `group_topic` event. Pass NULL to unset. @@ -2996,6 +3012,27 @@ s except Exception as e: LOG_WARN(f" Exception {e}") + def callback_group_topic_lock(self, callback: Optional[Callable], user_data: Optional[bytes] = None) -> None: + """ + Set the callback for the `group_topic` event. Pass NULL to unset. + This event is triggered when a peer changes the group topic. + """ + if user_data is not None: + assert isinstance(user_data, Array), type(user_data) + + LOG_DEBUG(f"tox.callback_group_topic_lock") + if callback is None: + Tox.libtoxcore.tox_callback_group_topic_lock(self._tox_pointer, POINTER(None)()) + self.group_topic_cb = None + return + c_callback = CFUNCTYPE(None, c_void_p, c_uint32, c_uint32, c_void_p) + self.group_topic_lock_cb = c_callback(callback) + try: + LOG_DEBUG(f"tox.callback_group_topic_lock") + Tox.libtoxcore.tox_callback_group_topic_lock(self._tox_pointer, self.group_topic_lock_cb) + except Exception as e: + LOG_WARN(f" Exception {e}") + def callback_group_privacy_state(self, callback: Optional[Callable], user_data: Optional[bytes] = None) -> None: """ Set the callback for the `group_privacy_state` event. Pass NULL to unset.