mirror of
https://github.com/Tha14/toxic.git
synced 2024-11-23 01:53:02 +01:00
Sort group peerlist by role/name
This commit is contained in:
parent
8526d4d77e
commit
b2c512687a
@ -1,2 +1 @@
|
|||||||
192.254.75.104 33445 6058FF1DA1E013AD4F829CBE8E5DDFD30A4DE55901B0997832E3E8A64E19026C
|
|
||||||
|
|
||||||
|
@ -265,6 +265,43 @@ void set_status_all_groups(Tox *m, uint8_t status)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns a weight for peer_sort_cmp based on the peer's role. */
|
||||||
|
#define PEER_CMP_BASE_WEIGHT 100000
|
||||||
|
static int peer_sort_cmp_weight(struct GroupPeer *peer)
|
||||||
|
{
|
||||||
|
int w = PEER_CMP_BASE_WEIGHT;
|
||||||
|
|
||||||
|
if (peer->role == TOX_GROUP_ROLE_FOUNDER)
|
||||||
|
w <<= 2;
|
||||||
|
else if (peer->role == TOX_GROUP_ROLE_MODERATOR)
|
||||||
|
w <<= 1;
|
||||||
|
else if (peer->role == TOX_GROUP_ROLE_OBSERVER)
|
||||||
|
w >>= 1;
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int peer_sort_cmp(const void *n1, const void *n2)
|
||||||
|
{
|
||||||
|
struct GroupPeer *peer1 = (struct GroupPeer *) n1;
|
||||||
|
struct GroupPeer *peer2 = (struct GroupPeer *) n2;
|
||||||
|
|
||||||
|
int res = qsort_strcasecmp_hlpr(peer1->name, peer2->name);
|
||||||
|
return res - peer_sort_cmp_weight(peer1) + peer_sort_cmp_weight(peer2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sorts the peer list, first by role, then by name. */
|
||||||
|
static void sort_peerlist(uint32_t groupnum)
|
||||||
|
{
|
||||||
|
GroupChat *chat = &groupchats[groupnum];
|
||||||
|
|
||||||
|
if (!chat)
|
||||||
|
return;
|
||||||
|
|
||||||
|
qsort(chat->peer_list, chat->max_idx, sizeof(struct GroupPeer), peer_sort_cmp);
|
||||||
|
}
|
||||||
|
|
||||||
/* Gets the peer_id associated with nick.
|
/* Gets the peer_id associated with nick.
|
||||||
* Returns -1 on failure or if nick is not assigned to anyone in the group.
|
* Returns -1 on failure or if nick is not assigned to anyone in the group.
|
||||||
*/
|
*/
|
||||||
@ -279,8 +316,8 @@ int group_get_nick_peer_id(uint32_t groupnum, const char *nick, uint32_t *peer_i
|
|||||||
|
|
||||||
for (i = 0; i < chat->max_idx; ++i) {
|
for (i = 0; i < chat->max_idx; ++i) {
|
||||||
if (chat->peer_list[i].active) {
|
if (chat->peer_list[i].active) {
|
||||||
if (strcmp(nick, groupchats[groupnum].peer_list[i].name) == 0) {
|
if (strcmp(nick, chat->peer_list[i].name) == 0) {
|
||||||
*peer_id = groupchats[groupnum].peer_list[i].peer_id;
|
*peer_id = chat->peer_list[i].peer_id;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -332,6 +369,8 @@ static void group_update_name_list(uint32_t groupnum)
|
|||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sort_peerlist(groupnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* destroys and re-creates groupchat window */
|
/* destroys and re-creates groupchat window */
|
||||||
@ -806,14 +845,17 @@ static void groupchat_onGroupModeration(ToxWindow *self, Tox *m, uint32_t groupn
|
|||||||
case TOX_GROUP_MOD_EVENT_OBSERVER:
|
case TOX_GROUP_MOD_EVENT_OBSERVER:
|
||||||
chat->peer_list[tgt_index].role = TOX_GROUP_ROLE_OBSERVER;
|
chat->peer_list[tgt_index].role = TOX_GROUP_ROLE_OBSERVER;
|
||||||
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to observer", src_name, tgt_name);
|
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to observer", src_name, tgt_name);
|
||||||
|
sort_peerlist(groupnum);
|
||||||
break;
|
break;
|
||||||
case TOX_GROUP_MOD_EVENT_USER:
|
case TOX_GROUP_MOD_EVENT_USER:
|
||||||
chat->peer_list[tgt_index].role = TOX_GROUP_ROLE_USER;
|
chat->peer_list[tgt_index].role = TOX_GROUP_ROLE_USER;
|
||||||
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to user", src_name, tgt_name);
|
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to user", src_name, tgt_name);
|
||||||
|
sort_peerlist(groupnum);
|
||||||
break;
|
break;
|
||||||
case TOX_GROUP_MOD_EVENT_MODERATOR:
|
case TOX_GROUP_MOD_EVENT_MODERATOR:
|
||||||
chat->peer_list[tgt_index].role = TOX_GROUP_ROLE_MODERATOR;
|
chat->peer_list[tgt_index].role = TOX_GROUP_ROLE_MODERATOR;
|
||||||
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to moderator", src_name, tgt_name);
|
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to moderator", src_name, tgt_name);
|
||||||
|
sort_peerlist(groupnum);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
@ -836,7 +878,7 @@ static void groupchat_onGroupNickChange(ToxWindow *self, Tox *m, uint32_t groupn
|
|||||||
char oldnick[TOX_MAX_NAME_LENGTH];
|
char oldnick[TOX_MAX_NAME_LENGTH];
|
||||||
get_group_nick_truncate(m, oldnick, peer_id, groupnum);
|
get_group_nick_truncate(m, oldnick, peer_id, groupnum);
|
||||||
|
|
||||||
len = MAX(len, TOX_MAX_NAME_LENGTH - 1);
|
len = MIN(len, TOX_MAX_NAME_LENGTH - 1);
|
||||||
memcpy(groupchats[groupnum].peer_list[peer_index].name, newnick, len);
|
memcpy(groupchats[groupnum].peer_list[peer_index].name, newnick, len);
|
||||||
chat->peer_list[peer_index].name[len] = '\0';
|
chat->peer_list[peer_index].name[len] = '\0';
|
||||||
chat->peer_list[peer_index].name_length = len;
|
chat->peer_list[peer_index].name_length = len;
|
||||||
|
Loading…
Reference in New Issue
Block a user