summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/nicklist.c17
-rw-r--r--src/core/nicklist.h2
-rw-r--r--src/fe-common/core/fe-channels.c10
3 files changed, 17 insertions, 12 deletions
diff --git a/src/core/nicklist.c b/src/core/nicklist.c
index 3d557987..73143644 100644
--- a/src/core/nicklist.c
+++ b/src/core/nicklist.c
@@ -357,7 +357,7 @@ GSList *nicklist_get_same_unique(SERVER_REC *server, void *id)
}
/* nick record comparision for sort functions */
-int nicklist_compare(NICK_REC *p1, NICK_REC *p2)
+int nicklist_compare(NICK_REC *p1, NICK_REC *p2, const char *nick_prefix)
{
int status1, status2;
@@ -369,10 +369,10 @@ int nicklist_compare(NICK_REC *p1, NICK_REC *p2)
* returns :-)
* -- yath */
- /* Treat others as highest - should really use order in 005 numeric */
- if (p1->other)
- status1 = 5;
- else if (p1->op)
+ if (p1->other) {
+ const char *other = (nick_prefix == NULL) ? NULL : strchr(nick_prefix, p1->other);
+ status1 = (other == NULL) ? 5 : 1000 - (other - nick_prefix);
+ } else if (p1->op)
status1 = 4;
else if (p1->halfop)
status1 = 3;
@@ -381,9 +381,10 @@ int nicklist_compare(NICK_REC *p1, NICK_REC *p2)
else
status1 = 1;
- if (p2->other)
- status2 = 5;
- else if (p2->op)
+ if (p2->other) {
+ const char *other = (nick_prefix == NULL) ? NULL : strchr(nick_prefix, p2->other);
+ status2 = (other == NULL) ? 5 : 1000 - (other - nick_prefix);
+ } else if (p2->op)
status2 = 4;
else if (p2->halfop)
status2 = 3;
diff --git a/src/core/nicklist.h b/src/core/nicklist.h
index a9683500..38c547a5 100644
--- a/src/core/nicklist.h
+++ b/src/core/nicklist.h
@@ -49,7 +49,7 @@ void nicklist_update_flags_unique(SERVER_REC *server, void *id,
void nicklist_set_own(CHANNEL_REC *channel, NICK_REC *nick);
/* Nick record comparision for sort functions */
-int nicklist_compare(NICK_REC *p1, NICK_REC *p2);
+int nicklist_compare(NICK_REC *p1, NICK_REC *p2, const char *nick_prefix);
/* Check is `msg' is meant for `nick'. */
int nick_match_msg(CHANNEL_REC *channel, const char *msg, const char *nick);
diff --git a/src/fe-common/core/fe-channels.c b/src/fe-common/core/fe-channels.c
index 5b531c2e..9bc51f37 100644
--- a/src/fe-common/core/fe-channels.c
+++ b/src/fe-common/core/fe-channels.c
@@ -473,12 +473,14 @@ void fe_channels_nicklist(CHANNEL_REC *channel, int flags)
NICK_REC *nick;
GSList *tmp, *nicklist, *sorted;
int nicks, normal, voices, halfops, ops;
+ const char *nick_flags;
nicks = normal = voices = halfops = ops = 0;
nicklist = nicklist_getnicks(channel);
sorted = NULL;
+ nick_flags = channel->server->get_nick_flags(channel->server);
- /* sort the nicklist */
+ /* filter (for flags) and count ops, halfops, voices */
for (tmp = nicklist; tmp != NULL; tmp = tmp->next) {
nick = tmp->data;
@@ -501,11 +503,13 @@ void fe_channels_nicklist(CHANNEL_REC *channel, int flags)
continue;
}
- sorted = g_slist_insert_sorted(sorted, nick, (GCompareFunc)
- nicklist_compare);
+ sorted = g_slist_prepend(sorted, nick);
}
g_slist_free(nicklist);
+ /* sort the nicklist */
+ sorted = g_slist_sort_with_data(sorted, (GCompareDataFunc) nicklist_compare, (void *)nick_flags);
+
/* display the nicks */
if ((flags & CHANNEL_NICKLIST_FLAG_COUNT) == 0) {
printformat(channel->server, channel->visible_name,