Added /roster order name|presence

This commit is contained in:
James Booth
2015-11-17 23:37:33 +00:00
parent 230a14219c
commit 8e8852fa9f
8 changed files with 184 additions and 10 deletions

View File

@@ -67,7 +67,8 @@ static gboolean _key_equals(void *key1, void *key2);
static gboolean _datetimes_equal(GDateTime *dt1, GDateTime *dt2);
static void _replace_name(const char *const current_name, const char *const new_name, const char *const barejid);
static void _add_name_and_barejid(const char *const name, const char *const barejid);
static gint _compare_contacts(PContact a, PContact b);
static gint _compare_name(PContact a, PContact b);
static gint _compare_presence(PContact a, PContact b);
void
roster_clear(void)
@@ -373,7 +374,7 @@ roster_get_contacts_by_presence(const char *const presence)
while (g_hash_table_iter_next(&iter, &key, &value)) {
PContact contact = (PContact)value;
if (g_strcmp0(p_contact_presence(contact), presence) == 0) {
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_contacts);
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_name);
}
}
@@ -381,6 +382,23 @@ roster_get_contacts_by_presence(const char *const presence)
return result;
}
GSList*
roster_get_contacts_ord_presence(void)
{
GSList *result = NULL;
GHashTableIter iter;
gpointer key;
gpointer value;
g_hash_table_iter_init(&iter, contacts);
while (g_hash_table_iter_next(&iter, &key, &value)) {
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_presence);
}
// return all contact structs
return result;
}
GSList*
roster_get_contacts(void)
{
@@ -391,7 +409,7 @@ roster_get_contacts(void)
g_hash_table_iter_init(&iter, contacts);
while (g_hash_table_iter_next(&iter, &key, &value)) {
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_contacts);
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_name);
}
// return all contact structs
@@ -409,7 +427,7 @@ roster_get_contacts_online(void)
g_hash_table_iter_init(&iter, contacts);
while (g_hash_table_iter_next(&iter, &key, &value)) {
if(strcmp(p_contact_presence(value), "offline"))
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_contacts);
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_name);
}
// return all contact structs
@@ -446,6 +464,26 @@ roster_fulljid_autocomplete(const char *const search_str)
return autocomplete_complete(fulljid_ac, search_str, TRUE);
}
GSList*
roster_get_nogroup_ord_presence(void)
{
GSList *result = NULL;
GHashTableIter iter;
gpointer key;
gpointer value;
g_hash_table_iter_init(&iter, contacts);
while (g_hash_table_iter_next(&iter, &key, &value)) {
GSList *groups = p_contact_groups(value);
if (groups == NULL) {
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_presence);
}
}
// return all contact structs
return result;
}
GSList*
roster_get_nogroup(void)
{
@@ -458,7 +496,31 @@ roster_get_nogroup(void)
while (g_hash_table_iter_next(&iter, &key, &value)) {
GSList *groups = p_contact_groups(value);
if (groups == NULL) {
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_contacts);
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_name);
}
}
// return all contact structs
return result;
}
GSList*
roster_get_group_ord_presence(const char *const group)
{
GSList *result = NULL;
GHashTableIter iter;
gpointer key;
gpointer value;
g_hash_table_iter_init(&iter, contacts);
while (g_hash_table_iter_next(&iter, &key, &value)) {
GSList *groups = p_contact_groups(value);
while (groups) {
if (strcmp(groups->data, group) == 0) {
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_presence);
break;
}
groups = g_slist_next(groups);
}
}
@@ -479,7 +541,7 @@ roster_get_group(const char *const group)
GSList *groups = p_contact_groups(value);
while (groups) {
if (strcmp(groups->data, group) == 0) {
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_contacts);
result = g_slist_insert_sorted(result, value, (GCompareFunc)_compare_name);
break;
}
groups = g_slist_next(groups);
@@ -560,7 +622,7 @@ _add_name_and_barejid(const char *const name, const char *const barejid)
}
static gint
_compare_contacts(PContact a, PContact b)
_compare_name(PContact a, PContact b)
{
const char * utf8_str_a = NULL;
const char * utf8_str_b = NULL;
@@ -580,3 +642,43 @@ _compare_contacts(PContact a, PContact b)
return result;
}
static gint
_get_presence_weight(const char *presence)
{
if (g_strcmp0(presence, "chat") == 0) {
return 0;
} else if (g_strcmp0(presence, "online") == 0) {
return 1;
} else if (g_strcmp0(presence, "away") == 0) {
return 2;
} else if (g_strcmp0(presence, "xa") == 0) {
return 3;
} else if (g_strcmp0(presence, "dnd") == 0) {
return 4;
} else { // offline
return 5;
}
}
static gint
_compare_presence(PContact a, PContact b)
{
const char *presence_a = p_contact_presence(a);
const char *presence_b = p_contact_presence(b);
// if presence different, order by presence
if (g_strcmp0(presence_a, presence_b) != 0) {
int weight_a = _get_presence_weight(presence_a);
int weight_b = _get_presence_weight(presence_b);
if (weight_a < weight_b) {
return -1;
} else {
return 1;
}
// otherwise order by name
} else {
return _compare_name(a, b);
}
}