-
Notifications
You must be signed in to change notification settings - Fork 19
/
在线状态.txt
177 lines (166 loc) · 6.6 KB
/
在线状态.txt
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
更新用户在线状态
user.status.expire就是指离线时间, 参考安装代码:
public static String formatUserStatus(TLRPC.User user) {
if (user != null && user.status != null && user.status.expires == 0) {
if (user.status instanceof TLRPC.TL_userStatusRecently) {
user.status.expires = -100;
} else if (user.status instanceof TLRPC.TL_userStatusLastWeek) {
user.status.expires = -101;
} else if (user.status instanceof TLRPC.TL_userStatusLastMonth) {
user.status.expires = -102;
}
}
if (user != null && user.status != null && user.status.expires <= 0) {
if (MessagesController.getInstance().onlinePrivacy.containsKey(user.id)) {
return getString("Online", R.string.Online);
}
}
if (user == null || user.status == null || user.status.expires == 0 || UserObject.isDeleted(user) || user instanceof TLRPC.TL_userEmpty) {
return getString("ALongTimeAgo", R.string.ALongTimeAgo);
} else {
int currentTime = ConnectionsManager.getInstance().getCurrentTime();
if (user.status.expires > currentTime) {
return getString("Online", R.string.Online);
} else {
if (user.status.expires == -1) {
return getString("Invisible", R.string.Invisible);
} else if (user.status.expires == -100) {
return getString("Lately", R.string.Lately);
} else if (user.status.expires == -101) {
return getString("WithinAWeek", R.string.WithinAWeek);
} else if (user.status.expires == -102) {
return getString("WithinAMonth", R.string.WithinAMonth);
} else {
return formatDateOnline(user.status.expires);
}
}
}
}
对方在线状态算法?
如果用户在线状态是公开的或我有权限访问他的在线状态, 那么看到的是"在线"或精确离线时间, 否则显示模糊时间(最近, 一周, 一月).
def visible(my_id, peer_id):
"""对方是否可见"""
if 对方设置所有人可见 and my_id not in 不共享:
return true
elif 对方设置联系人可见 and my_id in (他的联系人+总是共享) and my_id not in 从不共享:
return true
elif 对方设置不允许任何人 and my_id in 总是共享:
return true
return false
哪些人需要收到我的上下线update通知? 下面是集合运算:
if 所有人可见:
联系人中有我的人 + 我有一对一普通对话框的人(群和加密对话不算) - 从不共享的 - 不在线的
elif 联系人可见:
(是我的联系人 + 总是共享) & (联系人中有我的人 + 我有一对一普通对话框的人) - 从不共享 - 不在线的
elif 不允许任何人:
总是共享 & (联系人中有我的人 + 我有一对一普通对话框的人) - 不在线的
变更隐私设置-在线状态后需要重新发送update通知.
群成员的在线状态:
开放所有人可见的 or 互相关注的 or 最近活跃(3分钟), 的成员, 显示准确在线状态.
请求: false表示上线, true表示离线
08-25 15:52:58.932 23839-24026/im.wink.app.messenger D/tmessages: >>>>>>>>>>>>>>>>>> 发送请求:
TLRPC.TL_account_updateStatus#6628562c {
offline: false,
}
返回值: true表示服务器真的做出了更改; false表示和当前状态相同, 无需更新.
08-25 15:52:59.329 23839-24024/im.wink.app.messenger D/tmessages: <<<<<<<<<<<<<<<<<< 收到响应(org.telegram.tgnet.TLRPC$TL_boolTrue@f372c47):
TLRPC.TL_boolTrue#997275b5 {
}
Updates: 推送给在线的联系人中有我的人+当前对话列表中的peerUser.
只有是联系人并且隐私设置允许的情况下才能看到在线状态, 否则显示大致离线时间, 比如最近,一周,一月,很久没上线.
08-25 16:12:39.573 23839-24026/im.wink.app.messenger D/tmessages: <<<<<<<<<<<<<<<<<< 收到Updates:
TLRPC.TL_updateShort#78d4dec1 {
chat_id: 0,
chats: [],
date: 1535184759,
entities: [],
flags: 0,
from_id: 0,
fwd_from: null,
id: 0,
media: null,
media_unread: false,
mentioned: false,
message: null,
out: false,
pts: 0,
pts_count: 0,
reply_to_msg_id: 0,
seq: 0,
seq_start: 0,
silent: false,
update: TLRPC.TL_updateUserStatus#1bfbd823 {
action: null,
available_min_id: 0,
blocked: false,
channel_id: 0,
chat: null,
chat_id: 0,
chat_instance: 0 LONG,
data: null,
date: 0,
dc_options: [],
difference: null,
draft: null,
enabled: false,
entities: [],
first_name: null,
flags: 0,
foreign_link: null,
game_short_name: null,
geo: null,
inbox_date: 0,
inviter_id: 0,
is_admin: false,
key: null,
last_name: null,
masks: false,
max_date: 0,
max_id: 0,
media: null,
messages: [],
my_link: null,
notify_settings: null,
offset: null,
participant: null,
participants: null,
phone: null,
phone_call: null,
photo: null,
pinned: false,
popup: false,
previous: false,
pts: 0,
pts_count: 0,
qts: 0,
query: null,
query_id: 0 LONG,
random_id: 0 LONG,
rules: [],
status: TLRPC.TL_userStatusOnline#edb93949 {
expires: 1535185060, 上线状态 离线时间=当前时间+5分钟
},
status: TLRPC.TL_userStatusOffline#8c703f {
expires: 1535185605, 离线状态 离线时间
},
stickerset: null,
type: null,
user_id: 571691373,
username: null,
version: 0,
views: 0,
webpage: null,
},
updates: [],
user_id: 0,
users: [],
via_bot_id: 0,
}
[废弃] 用redis bitmap管理在线状态.
# 初始化, 清零
set status:bitmap " "
set status:bitmap 2 0
# 修改在线状态
set status [USER_ID] [1 or 0]
# 批量获取多人在线状态
bitfield d get u1 [用户1的ID] get u1 [用户2的ID] ...