join group with different credentials

This commit is contained in:
ingvar1995 2018-07-26 00:38:25 +03:00
parent 850c3b1ca3
commit 3272617403
7 changed files with 217 additions and 56 deletions

View File

@ -366,7 +366,7 @@ class App:
widgets_factory = None widgets_factory = None
widgets_factory_provider = Provider(lambda: widgets_factory) widgets_factory_provider = Provider(lambda: widgets_factory)
self._groups_service = GroupsService(self._tox, self._contacts_manager, self._contacts_provider, self._ms, self._groups_service = GroupsService(self._tox, self._contacts_manager, self._contacts_provider, self._ms,
widgets_factory_provider) widgets_factory_provider, self._profile)
widgets_factory = WidgetsFactory(self._settings, self._profile, self._profile_manager, self._contacts_manager, widgets_factory = WidgetsFactory(self._settings, self._profile, self._profile_manager, self._contacts_manager,
self._file_transfer_handler, self._smiley_loader, self._plugin_loader, self._file_transfer_handler, self._smiley_loader, self._plugin_loader,
self._toxes, self._version, self._groups_service, history) self._toxes, self._version, self._groups_service, history)

View File

@ -6,12 +6,13 @@ import wrapper.toxcore_enums_and_consts as constants
class GroupsService(tox_save.ToxSave): class GroupsService(tox_save.ToxSave):
def __init__(self, tox, contacts_manager, contacts_provider, main_screen, widgets_factory_provider): def __init__(self, tox, contacts_manager, contacts_provider, main_screen, widgets_factory_provider, profile):
super().__init__(tox) super().__init__(tox)
self._contacts_manager = contacts_manager self._contacts_manager = contacts_manager
self._contacts_provider = contacts_provider self._contacts_provider = contacts_provider
self._peers_list_widget = main_screen.peers_list self._peers_list_widget = main_screen.peers_list
self._widgets_factory_provider = widgets_factory_provider self._widgets_factory_provider = widgets_factory_provider
self._profile = profile
self._peer_screen = None self._peer_screen = None
def set_tox(self, tox): def set_tox(self, tox):
@ -23,8 +24,8 @@ class GroupsService(tox_save.ToxSave):
# Groups creation # Groups creation
# ----------------------------------------------------------------------------------------------------------------- # -----------------------------------------------------------------------------------------------------------------
def create_new_gc(self, name, privacy_state): def create_new_gc(self, name, privacy_state, nick, status):
group_number = self._tox.group_new(privacy_state, name.encode('utf-8')) group_number = self._tox.group_new(privacy_state, name, nick, status)
if group_number == -1: if group_number == -1:
return return
@ -32,12 +33,12 @@ class GroupsService(tox_save.ToxSave):
group = self._get_group_by_number(group_number) group = self._get_group_by_number(group_number)
group.status = constants.TOX_USER_STATUS['NONE'] group.status = constants.TOX_USER_STATUS['NONE']
def join_gc_by_id(self, chat_id, password): def join_gc_by_id(self, chat_id, password, nick, status):
group_number = self._tox.group_join(chat_id, password) group_number = self._tox.group_join(chat_id, password, nick, status)
self._add_new_group_by_number(group_number) self._add_new_group_by_number(group_number)
def join_gc_via_invite(self, invite_data, friend_number, password): def join_gc_via_invite(self, invite_data, friend_number, nick, status, password):
group_number = self._tox.group_invite_accept(invite_data, friend_number, password) group_number = self._tox.group_invite_accept(invite_data, friend_number, nick, status, password)
self._add_new_group_by_number(group_number) self._add_new_group_by_number(group_number)
# ----------------------------------------------------------------------------------------------------------------- # -----------------------------------------------------------------------------------------------------------------
@ -72,7 +73,7 @@ class GroupsService(tox_save.ToxSave):
friend = self._get_friend_by_number(friend_number) friend = self._get_friend_by_number(friend_number)
text = util_ui.tr('Friend {} invites you to group "{}". Accept?') text = util_ui.tr('Friend {} invites you to group "{}". Accept?')
if util_ui.question(text.format(friend.name, group_name), util_ui.tr('Group invite')): if util_ui.question(text.format(friend.name, group_name), util_ui.tr('Group invite')):
self.join_gc_via_invite(invite_data, friend_number, None) self.join_gc_via_invite(invite_data, friend_number, self._profile.name, self._profile.status or 0, None)
# ----------------------------------------------------------------------------------------------------------------- # -----------------------------------------------------------------------------------------------------------------
# Group info methods # Group info methods

View File

@ -3,72 +3,116 @@ import utils.util as util
from ui.widgets import * from ui.widgets import *
from wrapper.toxcore_enums_and_consts import * from wrapper.toxcore_enums_and_consts import *
# TODO: move common logic to separate class
class CreateGroupScreen(CenteredWidget): class CreateGroupScreen(CenteredWidget):
def __init__(self, groups_service): def __init__(self, groups_service, profile):
super().__init__() super().__init__()
self._groups_service = groups_service self._groups_service = groups_service
self._profile = profile
uic.loadUi(util.get_views_path('create_group_screen'), self) uic.loadUi(util.get_views_path('create_group_screen'), self)
self.center() self.center()
self._update_ui() self._update_ui()
def _update_ui(self): def _update_ui(self):
self._retranslate_ui() self._retranslate_ui()
self.statusComboBox.setCurrentIndex(self._profile.status or 0)
self.nickLineEdit.setText(self._profile.name)
self.addGroupButton.clicked.connect(self._create_group) self.addGroupButton.clicked.connect(self._create_group)
self.groupNameLineEdit.textChanged.connect(self._group_name_changed) self.groupNameLineEdit.textChanged.connect(self._group_name_changed)
self.nickLineEdit.textChanged.connect(self._nick_changed)
def _retranslate_ui(self): def _retranslate_ui(self):
self.setWindowTitle(util_ui.tr('Create new group chat')) self.setWindowTitle(util_ui.tr('Create new group chat'))
self.groupNameLabel.setText(util_ui.tr('Group name:')) self.groupNameLabel.setText(util_ui.tr('Group name:'))
self.groupTypeLabel.setText(util_ui.tr('Group type:')) self.groupTypeLabel.setText(util_ui.tr('Group type:'))
self.nickLabel.setText(util_ui.tr('Nickname:'))
self.statusLabel.setText(util_ui.tr('Status:'))
self.nickLineEdit.setPlaceholderText(util_ui.tr('Your nick in chat'))
self.groupNameLineEdit.setPlaceholderText(util_ui.tr('Group\'s persistent name')) self.groupNameLineEdit.setPlaceholderText(util_ui.tr('Group\'s persistent name'))
self.addGroupButton.setText(util_ui.tr('Create group')) self.addGroupButton.setText(util_ui.tr('Create group'))
self.groupTypeComboBox.addItem(util_ui.tr('Public')) self.groupTypeComboBox.addItem(util_ui.tr('Public'))
self.groupTypeComboBox.addItem(util_ui.tr('Private')) self.groupTypeComboBox.addItem(util_ui.tr('Private'))
self.groupTypeComboBox.setCurrentIndex(1) self.groupTypeComboBox.setCurrentIndex(1)
self.statusComboBox.addItem(util_ui.tr('Online'))
self.statusComboBox.addItem(util_ui.tr('Away'))
self.statusComboBox.addItem(util_ui.tr('Busy'))
def _create_group(self): def _create_group(self):
name = self.groupNameLineEdit.text() group_name = self.groupNameLineEdit.text()
privacy_state = self.groupTypeComboBox.currentIndex() privacy_state = self.groupTypeComboBox.currentIndex()
self._groups_service.create_new_gc(name, privacy_state) nick = self.nickLineEdit.text()
status = self.statusComboBox.currentIndex()
self._groups_service.create_new_gc(group_name, privacy_state, nick, status)
self.close() self.close()
def _nick_changed(self):
self._update_button_state()
def _group_name_changed(self): def _group_name_changed(self):
name = self.groupNameLineEdit.text() self._update_button_state()
self.addGroupButton.setEnabled(bool(name.strip()))
def _update_button_state(self):
is_nick_set = bool(self.nickLineEdit.text())
is_group_name_set = bool(self.groupNameLineEdit.text())
self.addGroupButton.setEnabled(is_nick_set and is_group_name_set)
class JoinGroupScreen(CenteredWidget): class JoinGroupScreen(CenteredWidget):
def __init__(self, groups_service): def __init__(self, groups_service, profile):
super().__init__() super().__init__()
self._groups_service = groups_service self._groups_service = groups_service
self._profile = profile
uic.loadUi(util.get_views_path('join_group_screen'), self) uic.loadUi(util.get_views_path('join_group_screen'), self)
self.center() self.center()
self._update_ui() self._update_ui()
def _update_ui(self): def _update_ui(self):
self._retranslate_ui() self._retranslate_ui()
self.statusComboBox.setCurrentIndex(self._profile.status or 0)
self.nickLineEdit.setText(self._profile.name)
self.chatIdLineEdit.textChanged.connect(self._chat_id_changed) self.chatIdLineEdit.textChanged.connect(self._chat_id_changed)
self.joinGroupButton.clicked.connect(self._join_group) self.joinGroupButton.clicked.connect(self._join_group)
self.nickLineEdit.textChanged.connect(self._nick_changed)
def _retranslate_ui(self): def _retranslate_ui(self):
self.setWindowTitle(util_ui.tr('Join public group chat')) self.setWindowTitle(util_ui.tr('Join public group chat'))
self.chatIdLabel.setText(util_ui.tr('Group ID:')) self.chatIdLabel.setText(util_ui.tr('Group ID:'))
self.passwordLabel.setText(util_ui.tr('Password:')) self.passwordLabel.setText(util_ui.tr('Password:'))
self.nickLabel.setText(util_ui.tr('Nickname:'))
self.statusLabel.setText(util_ui.tr('Status:'))
self.chatIdLineEdit.setPlaceholderText(util_ui.tr('Group\'s chat ID')) self.chatIdLineEdit.setPlaceholderText(util_ui.tr('Group\'s chat ID'))
self.nickLineEdit.setPlaceholderText(util_ui.tr('Your nick in chat'))
self.joinGroupButton.setText(util_ui.tr('Join group')) self.joinGroupButton.setText(util_ui.tr('Join group'))
self.passwordLineEdit.setPlaceholderText(util_ui.tr('Optional password')) self.passwordLineEdit.setPlaceholderText(util_ui.tr('Optional password'))
self.statusComboBox.addItem(util_ui.tr('Online'))
self.statusComboBox.addItem(util_ui.tr('Away'))
self.statusComboBox.addItem(util_ui.tr('Busy'))
def _chat_id_changed(self): def _chat_id_changed(self):
self._update_button_state()
def _nick_changed(self):
self._update_button_state()
def _update_button_state(self):
chat_id = self._get_chat_id() chat_id = self._get_chat_id()
self.joinGroupButton.setEnabled(len(chat_id) == TOX_GROUP_CHAT_ID_SIZE * 2) is_nick_set = bool(self.nickLineEdit.text())
self.joinGroupButton.setEnabled(len(chat_id) == TOX_GROUP_CHAT_ID_SIZE * 2 and is_nick_set)
def _join_group(self): def _join_group(self):
chat_id = self._get_chat_id() chat_id = self._get_chat_id()
password = self.passwordLineEdit.text() password = self.passwordLineEdit.text()
self._groups_service.join_gc_by_id(chat_id, password) nick = self.nickLineEdit.text()
status = self.statusComboBox.currentIndex()
self._groups_service.join_gc_by_id(chat_id, password, nick, status)
self.close() self.close()
def _get_chat_id(self): def _get_chat_id(self):

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>639</width> <width>640</width>
<height>199</height> <height>300</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -19,9 +19,9 @@
</property> </property>
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>180</x> <x>20</x>
<y>150</y> <y>250</y>
<width>271</width> <width>601</width>
<height>41</height> <height>41</height>
</rect> </rect>
</property> </property>
@ -32,28 +32,28 @@
<widget class="QLineEdit" name="groupNameLineEdit"> <widget class="QLineEdit" name="groupNameLineEdit">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>140</x> <x>150</x>
<y>40</y> <y>20</y>
<width>471</width> <width>470</width>
<height>31</height> <height>35</height>
</rect> </rect>
</property> </property>
</widget> </widget>
<widget class="QComboBox" name="groupTypeComboBox"> <widget class="QComboBox" name="groupTypeComboBox">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>140</x> <x>150</x>
<y>100</y> <y>80</y>
<width>471</width> <width>470</width>
<height>41</height> <height>35</height>
</rect> </rect>
</property> </property>
</widget> </widget>
<widget class="QLabel" name="groupNameLabel"> <widget class="QLabel" name="groupNameLabel">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>20</x>
<y>40</y> <y>20</y>
<width>121</width> <width>121</width>
<height>31</height> <height>31</height>
</rect> </rect>
@ -65,8 +65,8 @@
<widget class="QLabel" name="groupTypeLabel"> <widget class="QLabel" name="groupTypeLabel">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>20</x>
<y>100</y> <y>80</y>
<width>121</width> <width>121</width>
<height>31</height> <height>31</height>
</rect> </rect>
@ -75,6 +75,52 @@
<string>TextLabel</string> <string>TextLabel</string>
</property> </property>
</widget> </widget>
<widget class="QLabel" name="statusLabel">
<property name="geometry">
<rect>
<x>20</x>
<y>200</y>
<width>111</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
<widget class="QLabel" name="nickLabel">
<property name="geometry">
<rect>
<x>20</x>
<y>150</y>
<width>111</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
<widget class="QLineEdit" name="nickLineEdit">
<property name="geometry">
<rect>
<x>150</x>
<y>140</y>
<width>470</width>
<height>35</height>
</rect>
</property>
</widget>
<widget class="QComboBox" name="statusComboBox">
<property name="geometry">
<rect>
<x>150</x>
<y>190</y>
<width>470</width>
<height>35</height>
</rect>
</property>
</widget>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>

View File

@ -6,10 +6,22 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>739</width> <width>740</width>
<height>212</height> <height>320</height>
</rect> </rect>
</property> </property>
<property name="minimumSize">
<size>
<width>740</width>
<height>320</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>740</width>
<height>320</height>
</size>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
@ -17,7 +29,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>30</x> <x>30</x>
<y>40</y> <y>30</y>
<width>67</width> <width>67</width>
<height>17</height> <height>17</height>
</rect> </rect>
@ -30,7 +42,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>30</x> <x>30</x>
<y>100</y> <y>90</y>
<width>67</width> <width>67</width>
<height>17</height> <height>17</height>
</rect> </rect>
@ -45,9 +57,9 @@
</property> </property>
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>258</x> <x>30</x>
<y>150</y> <y>260</y>
<width>241</width> <width>680</width>
<height>51</height> <height>51</height>
</rect> </rect>
</property> </property>
@ -60,7 +72,7 @@
<rect> <rect>
<x>190</x> <x>190</x>
<y>20</y> <y>20</y>
<width>431</width> <width>520</width>
<height>41</height> <height>41</height>
</rect> </rect>
</property> </property>
@ -69,8 +81,54 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>190</x> <x>190</x>
<y>90</y> <y>80</y>
<width>431</width> <width>520</width>
<height>41</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="nickLabel">
<property name="geometry">
<rect>
<x>30</x>
<y>150</y>
<width>67</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
<widget class="QLabel" name="statusLabel">
<property name="geometry">
<rect>
<x>30</x>
<y>210</y>
<width>67</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
<widget class="QLineEdit" name="nickLineEdit">
<property name="geometry">
<rect>
<x>190</x>
<y>140</y>
<width>520</width>
<height>41</height>
</rect>
</property>
</widget>
<widget class="QComboBox" name="statusComboBox">
<property name="geometry">
<rect>
<x>190</x>
<y>200</y>
<width>520</width>
<height>41</height> <height>41</height>
</rect> </rect>
</property> </property>

View File

@ -64,10 +64,10 @@ class WidgetsFactory:
return StickerWindow(self._file_transfer_handler, self._contacts_manager) return StickerWindow(self._file_transfer_handler, self._contacts_manager)
def create_group_screen_window(self): def create_group_screen_window(self):
return CreateGroupScreen(self._groups_service) return CreateGroupScreen(self._groups_service, self._profile)
def create_join_group_screen_window(self): def create_join_group_screen_window(self):
return JoinGroupScreen(self._groups_service) return JoinGroupScreen(self._groups_service, self._profile)
def create_search_screen(self, messages): def create_search_screen(self, messages):
return SearchScreen(self._contacts_manager, self._history, messages, messages.parent()) return SearchScreen(self._contacts_manager, self._history, messages, messages.parent())

View File

@ -29,7 +29,7 @@ class ToxOptions(Structure):
class GroupChatSelfPeerInfo(Structure): class GroupChatSelfPeerInfo(Structure):
_fields_ = [ _fields_ = [
('nick', c_char_p), ('nick', c_char_p),
('nick_length', c_uint16), ('nick_length', c_uint8),
('user_status', c_int) ('user_status', c_int)
] ]
@ -1533,7 +1533,7 @@ class Tox:
# Group chat instance management # Group chat instance management
# ----------------------------------------------------------------------------------------------------------------- # -----------------------------------------------------------------------------------------------------------------
def group_new(self, privacy_state, group_name): def group_new(self, privacy_state, group_name, nick, status):
""" """
Creates a new group chat. Creates a new group chat.
@ -1551,12 +1551,16 @@ class Tox:
""" """
error = c_int() error = c_int()
peer_info = self.group_chat_self_peer_info_new() peer_info = self.group_self_peer_info_new()
result = Tox.libtoxcore.tox_group_new(self._tox_pointer, privacy_state, group_name, nick = bytes(nick, 'utf-8')
peer_info.contents.nick = c_char_p(nick)
peer_info.contents.nick_length = len(nick)
peer_info.contents.user_status = status
result = Tox.libtoxcore.tox_group_new(self._tox_pointer, privacy_state, group_name.encode('utf-8'),
len(group_name), peer_info, byref(error)) len(group_name), peer_info, byref(error))
return result return result
def group_join(self, chat_id, password): def group_join(self, chat_id, password, nick, status):
""" """
Joins a group chat with specified Chat ID. Joins a group chat with specified Chat ID.
@ -1571,7 +1575,11 @@ class Tox:
""" """
error = c_int() error = c_int()
peer_info = self.group_chat_self_peer_info_new() peer_info = self.group_self_peer_info_new()
nick = bytes(nick, 'utf-8')
peer_info.contents.nick = c_char_p(nick)
peer_info.contents.nick_length = len(nick)
peer_info.contents.user_status = status
result = Tox.libtoxcore.tox_group_join(self._tox_pointer, string_to_bin(chat_id), result = Tox.libtoxcore.tox_group_join(self._tox_pointer, string_to_bin(chat_id),
password, password,
len(password) if password is not None else 0, len(password) if password is not None else 0,
@ -2171,15 +2179,15 @@ class Tox:
result = Tox.libtoxcore.tox_group_invite_friend(self._tox_pointer, group_number, friend_number, byref(error)) result = Tox.libtoxcore.tox_group_invite_friend(self._tox_pointer, group_number, friend_number, byref(error))
return result return result
def group_chat_self_peer_info_new(self): def group_self_peer_info_new(self):
error = c_int() error = c_int()
f = Tox.libtoxcore.group_chat_self_peer_info_new f = Tox.libtoxcore.tox_group_self_peer_info_new
f.restype = POINTER(GroupChatSelfPeerInfo) f.restype = POINTER(GroupChatSelfPeerInfo)
result = f(self._tox_pointer, byref(error)) result = f(self._tox_pointer, byref(error))
return result return result
def group_invite_accept(self, invite_data, friend_number, password=None): def group_invite_accept(self, invite_data, friend_number, nick, status, password=None):
""" """
Accept an invite to a group chat that the client previously received from a friend. The invite Accept an invite to a group chat that the client previously received from a friend. The invite
is only valid while the inviter is present in the group. is only valid while the inviter is present in the group.
@ -2192,7 +2200,11 @@ class Tox:
error = c_int() error = c_int()
f = Tox.libtoxcore.tox_group_invite_accept f = Tox.libtoxcore.tox_group_invite_accept
f.restype = c_uint32 f.restype = c_uint32
peer_info = self.group_chat_self_peer_info_new() peer_info = self.group_self_peer_info_new()
nick = bytes(nick, 'utf-8')
peer_info.contents.nick = c_char_p(nick)
peer_info.contents.nick_length = len(nick)
peer_info.contents.user_status = status
result = f(self._tox_pointer, friend_number, invite_data, len(invite_data), password, result = f(self._tox_pointer, friend_number, invite_data, len(invite_data), password,
len(password) if password is not None else 0, peer_info, byref(error)) len(password) if password is not None else 0, peer_info, byref(error))
print('Invite accept. Result:', result, 'Error:', error.value) print('Invite accept. Result:', result, 'Error:', error.value)