summaryrefslogtreecommitdiff
path: root/poezio/roster_sorting.py
blob: 9f156e0fce7ee8e1e310c6e3b8ba80822a0936a7 (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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
"""
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,
}