mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
feat: rework sendOfflinePacketAfterOnline
This commit is contained in:
parent
a3f4185b45
commit
84c62470bb
7 changed files with 154 additions and 18 deletions
|
@ -96,6 +96,8 @@ nice_target_sources(Telegram ${src_loc}
|
||||||
PRIVATE
|
PRIVATE
|
||||||
${style_files}
|
${style_files}
|
||||||
|
|
||||||
|
ayu/ayu_worker.cpp
|
||||||
|
ayu/ayu_worker.h
|
||||||
ayu/ayu_url_handlers.cpp
|
ayu/ayu_url_handlers.cpp
|
||||||
ayu/ayu_url_handlers.h
|
ayu/ayu_url_handlers.h
|
||||||
ayu/ayu_state.cpp
|
ayu/ayu_state.cpp
|
||||||
|
|
|
@ -85,6 +85,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
// AyuGram includes
|
// AyuGram includes
|
||||||
#include "ayu/ayu_settings.h"
|
#include "ayu/ayu_settings.h"
|
||||||
|
#include "ayu/ayu_worker.h"
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -3781,6 +3782,8 @@ void ApiWrap::sendMessage(MessageToSend &&message) {
|
||||||
draftTopicRootId,
|
draftTopicRootId,
|
||||||
UnixtimeFromMsgId(response.outerMsgId));
|
UnixtimeFromMsgId(response.outerMsgId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AyuWorker::markAsOnline(_session);
|
||||||
};
|
};
|
||||||
const auto fail = [=](
|
const auto fail = [=](
|
||||||
const MTP::Error &error,
|
const MTP::Error &error,
|
||||||
|
@ -3874,6 +3877,8 @@ void ApiWrap::sendBotStart(
|
||||||
MTP_string(token)
|
MTP_string(token)
|
||||||
)).done([=](const MTPUpdates &result) {
|
)).done([=](const MTPUpdates &result) {
|
||||||
applyUpdates(result);
|
applyUpdates(result);
|
||||||
|
|
||||||
|
AyuWorker::markAsOnline(_session);
|
||||||
}).fail([=](const MTP::Error &error) {
|
}).fail([=](const MTP::Error &error) {
|
||||||
if (chat) {
|
if (chat) {
|
||||||
const auto type = error.type();
|
const auto type = error.type();
|
||||||
|
@ -4125,6 +4130,8 @@ void ApiWrap::sendMediaWithRandomId(
|
||||||
if (updateRecentStickers) {
|
if (updateRecentStickers) {
|
||||||
requestRecentStickersForce(true);
|
requestRecentStickersForce(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AyuWorker::markAsOnline(_session);
|
||||||
}, [=](const MTP::Error &error, const MTP::Response &response) {
|
}, [=](const MTP::Error &error, const MTP::Response &response) {
|
||||||
if (done) done(false);
|
if (done) done(false);
|
||||||
sendMessageFail(error, peer, randomId, itemId);
|
sendMessageFail(error, peer, randomId, itemId);
|
||||||
|
@ -4230,6 +4237,8 @@ void ApiWrap::sendAlbumIfReady(not_null<SendingAlbum*> album) {
|
||||||
(sendAs ? sendAs->input : MTP_inputPeerEmpty())
|
(sendAs ? sendAs->input : MTP_inputPeerEmpty())
|
||||||
), [=](const MTPUpdates &result, const MTP::Response &response) {
|
), [=](const MTPUpdates &result, const MTP::Response &response) {
|
||||||
_sendingAlbums.remove(groupId);
|
_sendingAlbums.remove(groupId);
|
||||||
|
|
||||||
|
AyuWorker::markAsOnline(_session);
|
||||||
}, [=](const MTP::Error &error, const MTP::Response &response) {
|
}, [=](const MTP::Error &error, const MTP::Response &response) {
|
||||||
if (const auto album = _sendingAlbums.take(groupId)) {
|
if (const auto album = _sendingAlbums.take(groupId)) {
|
||||||
for (const auto &item : (*album)->items) {
|
for (const auto &item : (*album)->items) {
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "ayu_infra.h"
|
#include "ayu_infra.h"
|
||||||
|
|
||||||
#include "ayu_lang.h"
|
#include "ayu_lang.h"
|
||||||
|
#include "ayu_worker.h"
|
||||||
#include "ayu/database/ayu_database.h"
|
#include "ayu/database/ayu_database.h"
|
||||||
#include "lang/lang_instance.h"
|
#include "lang/lang_instance.h"
|
||||||
#include "ayu/ayu_settings.h"
|
#include "ayu/ayu_settings.h"
|
||||||
|
@ -26,11 +27,6 @@ void initLang()
|
||||||
CustomLangPack::currentInstance()->fetchCustomLangPack(langPackId, langPackBaseId);
|
CustomLangPack::currentInstance()->fetchCustomLangPack(langPackId, langPackBaseId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initDatabase()
|
|
||||||
{
|
|
||||||
AyuDatabase::initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
void initFonts()
|
void initFonts()
|
||||||
{
|
{
|
||||||
auto settings = &AyuSettings::getInstance();
|
auto settings = &AyuSettings::getInstance();
|
||||||
|
@ -39,11 +35,22 @@ void initFonts()
|
||||||
AyuFonts::setMonoFont(settings->monoFont);
|
AyuFonts::setMonoFont(settings->monoFont);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void initDatabase()
|
||||||
|
{
|
||||||
|
AyuDatabase::initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void initWorker()
|
||||||
|
{
|
||||||
|
AyuWorker::initialize();
|
||||||
|
}
|
||||||
|
|
||||||
void init()
|
void init()
|
||||||
{
|
{
|
||||||
initLang();
|
initLang();
|
||||||
initFonts();
|
|
||||||
initDatabase();
|
initDatabase();
|
||||||
|
initFonts();
|
||||||
|
initWorker();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -17,6 +17,9 @@
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "ayu_worker.h"
|
||||||
|
#include "window/window_controller.h"
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
namespace AyuSettings
|
namespace AyuSettings
|
||||||
|
@ -298,6 +301,12 @@ void AyuGramSettings::set_ghostModeEnabled(bool val)
|
||||||
set_sendOnlinePackets(!val);
|
set_sendOnlinePackets(!val);
|
||||||
set_sendUploadProgress(!val);
|
set_sendUploadProgress(!val);
|
||||||
set_sendOfflinePacketAfterOnline(val);
|
set_sendOfflinePacketAfterOnline(val);
|
||||||
|
|
||||||
|
if (const auto window = Core::App().activeWindow()) {
|
||||||
|
if (const auto session = window->maybeSession()) {
|
||||||
|
AyuWorker::markAsOnline(session); // mark as online to get offline instantly
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AyuGramSettings::set_markReadAfterSend(bool val)
|
void AyuGramSettings::set_markReadAfterSend(bool val)
|
||||||
|
|
88
Telegram/SourceFiles/ayu/ayu_worker.cpp
Normal file
88
Telegram/SourceFiles/ayu/ayu_worker.cpp
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
// This is the source code of AyuGram for Desktop.
|
||||||
|
//
|
||||||
|
// We do not and cannot prevent the use of our code,
|
||||||
|
// but be respectful and credit the original author.
|
||||||
|
//
|
||||||
|
// Copyright @Radolyn, 2023
|
||||||
|
#include "ayu_worker.h"
|
||||||
|
|
||||||
|
#include "apiwrap.h"
|
||||||
|
#include "ayu_settings.h"
|
||||||
|
#include "base/unixtime.h"
|
||||||
|
#include "core/application.h"
|
||||||
|
#include "data/data_user.h"
|
||||||
|
#include "database/entities.h"
|
||||||
|
#include "main/main_account.h"
|
||||||
|
#include "main/main_domain.h"
|
||||||
|
#include "main/main_session.h"
|
||||||
|
|
||||||
|
namespace AyuWorker
|
||||||
|
{
|
||||||
|
std::unordered_map<ID, bool> state;
|
||||||
|
|
||||||
|
void markAsOnline(not_null<Main::Session *> session)
|
||||||
|
{
|
||||||
|
state[session->userId().bare] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lateInit()
|
||||||
|
{
|
||||||
|
for (const auto &[index, account] : Core::App().domain().accounts()) {
|
||||||
|
if (const auto session = account->maybeSession()) {
|
||||||
|
const auto id = session->userId().bare;
|
||||||
|
state[id] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void runOnce()
|
||||||
|
{
|
||||||
|
if (!Core::App().domain().started()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.empty()) {
|
||||||
|
lateInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto settings = &AyuSettings::getInstance();
|
||||||
|
if (!settings->sendOfflinePacketAfterOnline) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto t = base::unixtime::now();
|
||||||
|
const auto invalidateAll = cOtherOnline() >= t;
|
||||||
|
|
||||||
|
for (const auto &[index, account] : Core::App().domain().accounts()) {
|
||||||
|
if (const auto session = account->maybeSession()) {
|
||||||
|
const auto id = session->userId().bare;
|
||||||
|
if (!state.contains(id)) {
|
||||||
|
state[id] = true; // newly added account, I suppose
|
||||||
|
}
|
||||||
|
|
||||||
|
if (invalidateAll || state[id] || session->user()->lastseen().isOnline(t)) {
|
||||||
|
session->api().request(MTPaccount_UpdateStatus(
|
||||||
|
MTP_bool(true)
|
||||||
|
)).send();
|
||||||
|
state[id] = false;
|
||||||
|
|
||||||
|
LOG(("[AyuGram] Sent offline for account with uid %1, invalidate %2").arg(id).arg(invalidateAll));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[[noreturn]] void loop()
|
||||||
|
{
|
||||||
|
while (true) {
|
||||||
|
runOnce();
|
||||||
|
std::this_thread::sleep_for(std::chrono::seconds(3));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void initialize()
|
||||||
|
{
|
||||||
|
std::thread t(loop);
|
||||||
|
t.detach();
|
||||||
|
}
|
||||||
|
}
|
17
Telegram/SourceFiles/ayu/ayu_worker.h
Normal file
17
Telegram/SourceFiles/ayu/ayu_worker.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// This is the source code of AyuGram for Desktop.
|
||||||
|
//
|
||||||
|
// We do not and cannot prevent the use of our code,
|
||||||
|
// but be respectful and credit the original author.
|
||||||
|
//
|
||||||
|
// Copyright @Radolyn, 2023
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "window/window_session_controller.h"
|
||||||
|
|
||||||
|
namespace AyuWorker
|
||||||
|
{
|
||||||
|
|
||||||
|
void markAsOnline(not_null<Main::Session *> session);
|
||||||
|
void initialize();
|
||||||
|
|
||||||
|
}
|
|
@ -18,6 +18,7 @@
|
||||||
#include "inline_bots/inline_bot_result.h"
|
#include "inline_bots/inline_bot_result.h"
|
||||||
#include "lang_auto.h"
|
#include "lang_auto.h"
|
||||||
#include "apiwrap.h"
|
#include "apiwrap.h"
|
||||||
|
#include "ayu/ayu_worker.h"
|
||||||
#include "data/data_forum.h"
|
#include "data/data_forum.h"
|
||||||
#include "data/data_user.h"
|
#include "data/data_user.h"
|
||||||
#include "data/data_forum_topic.h"
|
#include "data/data_forum_topic.h"
|
||||||
|
@ -41,6 +42,7 @@ std::unordered_set<ID> ayugram_channels = {
|
||||||
1434550607, // @radolyn
|
1434550607, // @radolyn
|
||||||
1947958814, // @ayugramfun
|
1947958814, // @ayugramfun
|
||||||
1815864846, // @ayugramfcm
|
1815864846, // @ayugramfcm
|
||||||
|
2130395384, // @ayugram_easter
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unordered_set<ID> ayugram_devs = {
|
std::unordered_set<ID> ayugram_devs = {
|
||||||
|
@ -296,6 +298,8 @@ void MarkAsReadThread(not_null<Data::Thread *> thread)
|
||||||
if (thread->unreadReactions().has()) {
|
if (thread->unreadReactions().has()) {
|
||||||
sendReadReactions(thread);
|
sendReadReactions(thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AyuWorker::markAsOnline(&thread->session());
|
||||||
}
|
}
|
||||||
|
|
||||||
void readHistory(not_null<HistoryItem *> message)
|
void readHistory(not_null<HistoryItem *> message)
|
||||||
|
@ -310,19 +314,19 @@ void readHistory(not_null<HistoryItem *> message)
|
||||||
return history->session().api().request(MTPchannels_ReadHistory(
|
return history->session().api().request(MTPchannels_ReadHistory(
|
||||||
channel->inputChannel,
|
channel->inputChannel,
|
||||||
MTP_int(tillId)
|
MTP_int(tillId)
|
||||||
)).send();
|
)).done([=] { AyuWorker::markAsOnline(&history->session()); }).send();
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
return history->session().api().request(MTPmessages_ReadHistory(
|
return history->session().api().request(MTPmessages_ReadHistory(
|
||||||
history->peer->input,
|
history->peer->input,
|
||||||
MTP_int(tillId)
|
MTP_int(tillId)
|
||||||
)).done([=](const MTPmessages_AffectedMessages &result)
|
)).done([=](const MTPmessages_AffectedMessages &result)
|
||||||
{
|
{
|
||||||
history->session().api().applyAffectedMessages(history->peer, result);
|
history->session().api().applyAffectedMessages(history->peer, result);
|
||||||
|
AyuWorker::markAsOnline(&history->session());
|
||||||
}).fail([=]
|
}).fail([=]
|
||||||
{
|
{
|
||||||
}).send();
|
}).send();
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (history->unreadMentions().has()) {
|
if (history->unreadMentions().has()) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue