summaryrefslogtreecommitdiff
path: root/src/roster_sorting.py
blob: c57f0dce3c0882dc943d8c696e8f969f2405a855 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
"""
Defines the roster sorting methods used in roster.py
(for contacts/groups)
"""

########################### Contacts sorting ############################

PRESENCE_PRIORITY = {'unavailable': 5,
                     'xa': 4,
                     'away': 3,
                     'dnd': 2,
                     '': 1,
                     'available': 1}

def sort_jid(contact):
    """Sort by contact JID"""
    return contact.bare_jid

def sort_show(contact):
    """Sort by show (from high availability to low)"""
    res = contact.get_highest_priority_resource()
    if not res:
        return 5
    show = res.presence
    if show not in PRESENCE_PRIORITY:
        return 0
    return PRESENCE_PRIORITY[show]

def sort_resource_nb(contact):
    """Sort by number of connected resources"""
    return - len(contact)

def sort_name(contact):
    """Sort by name (case insensitive)"""
    return contact.name.lower() or contact.bare_jid

def sort_sname(contact):
    """Sort by name (case sensitive)"""
    return contact.name or contact.bare_jid

def sort_online(contact):
    """Sort by connected/disconnected"""
    result = sort_show(contact)
    return 0 if result < 5 else 1

SORTING_METHODS = {
    'jid': sort_jid,
    'sname': sort_sname,
    'show': sort_show,
    'resource': sort_resource_nb,
    'name': sort_name,
    'online': sort_online,
}


######################## Roster Groups sorting ##########################

def sort_group_name(group):
    """Sort by name (case insensitive)"""
    return group.name.lower()

def sort_group_sname(group):
    """Sort by name (case-sensitive)"""
    return group.name

def sort_group_folded(group):
    """Sort by folded/unfolded"""
    return group.folded

def sort_group_connected(group):
    """Sort by number of connected contacts"""
    return - group.get_nb_connected_contacts()

def sort_group_size(group):
    """Sort by group size"""
    return - len(group)

def sort_group_none(group):
    """Put the none group at the end, if any"""
    return 0 if group.name != 'none' else 1

GROUP_SORTING_METHODS = {
        'name': sort_group_name,
        'fold': sort_group_folded,
        'connected': sort_group_connected,
        'size': sort_group_size,
        'none': sort_group_none,
        'sname': sort_group_sname,
}