mirror of https://github.com/procxx/kepka.git
Remove locally saved empty histories.
This commit is contained in:
parent
39b7f307a4
commit
0247e876df
|
@ -719,9 +719,6 @@ void ApiWrap::requestDialogs(Data::Folder *folder) {
|
||||||
void ApiWrap::requestMoreDialogs(Data::Folder *folder) {
|
void ApiWrap::requestMoreDialogs(Data::Folder *folder) {
|
||||||
const auto state = dialogsLoadState(folder);
|
const auto state = dialogsLoadState(folder);
|
||||||
if (!state) {
|
if (!state) {
|
||||||
if (!folder) {
|
|
||||||
_session->data().addAllSavedPeers();
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
} else if (state->requestId) {
|
} else if (state->requestId) {
|
||||||
return;
|
return;
|
||||||
|
@ -2444,9 +2441,6 @@ void ApiWrap::clearHistory(not_null<PeerData*> peer, bool revoke) {
|
||||||
if (const auto last = history->lastMessage()) {
|
if (const auto last = history->lastMessage()) {
|
||||||
deleteTillId = last->id;
|
deleteTillId = last->id;
|
||||||
}
|
}
|
||||||
if (const auto last = history->chatListMessage()) {
|
|
||||||
Local::addSavedPeer(history->peer, ItemDateTime(last));
|
|
||||||
}
|
|
||||||
history->clear(History::ClearType::ClearHistory);
|
history->clear(History::ClearType::ClearHistory);
|
||||||
}
|
}
|
||||||
if (const auto channel = peer->asChannel()) {
|
if (const auto channel = peer->asChannel()) {
|
||||||
|
|
|
@ -189,8 +189,6 @@ void Session::clear() {
|
||||||
base::take(_channelMessages);
|
base::take(_channelMessages);
|
||||||
_messageByRandomId.clear();
|
_messageByRandomId.clear();
|
||||||
_sentMessagesData.clear();
|
_sentMessagesData.clear();
|
||||||
cSetSavedPeers(SavedPeers());
|
|
||||||
cSetSavedPeersByTime(SavedPeersByTime());
|
|
||||||
cSetRecentInlineBots(RecentInlineBots());
|
cSetRecentInlineBots(RecentInlineBots());
|
||||||
cSetRecentStickers(RecentStickerPack());
|
cSetRecentStickers(RecentStickerPack());
|
||||||
cSetReportSpamStatuses(ReportSpamStatuses());
|
cSetReportSpamStatuses(ReportSpamStatuses());
|
||||||
|
@ -1415,12 +1413,6 @@ void Session::applyDialog(
|
||||||
history->applyDialog(requestFolder, data);
|
history->applyDialog(requestFolder, data);
|
||||||
setPinnedFromDialog(history, data.is_pinned());
|
setPinnedFromDialog(history, data.is_pinned());
|
||||||
|
|
||||||
if (!history->fixedOnTopIndex() && !history->isPinnedDialog()) {
|
|
||||||
const auto date = history->chatListTimeId();
|
|
||||||
if (date != 0) {
|
|
||||||
addSavedPeersAfter(ParseDateTime(date));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (const auto from = history->peer->migrateFrom()) {
|
if (const auto from = history->peer->migrateFrom()) {
|
||||||
if (const auto historyFrom = from->owner().historyLoaded(from)) {
|
if (const auto historyFrom = from->owner().historyLoaded(from)) {
|
||||||
App::main()->removeDialog(historyFrom);
|
App::main()->removeDialog(historyFrom);
|
||||||
|
@ -1441,31 +1433,6 @@ void Session::applyDialog(
|
||||||
const auto folder = processFolder(data.vfolder);
|
const auto folder = processFolder(data.vfolder);
|
||||||
folder->applyDialog(data);
|
folder->applyDialog(data);
|
||||||
setPinnedFromDialog(folder, data.is_pinned());
|
setPinnedFromDialog(folder, data.is_pinned());
|
||||||
|
|
||||||
if (!folder->fixedOnTopIndex() && !folder->isPinnedDialog()) {
|
|
||||||
const auto date = folder->chatListTimeId();
|
|
||||||
if (date != 0) {
|
|
||||||
addSavedPeersAfter(ParseDateTime(date));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Session::addSavedPeersAfter(const QDateTime &date) {
|
|
||||||
auto &saved = cRefSavedPeersByTime();
|
|
||||||
while (!saved.isEmpty() && (date.isNull() || date < saved.lastKey())) {
|
|
||||||
const auto lastDate = saved.lastKey();
|
|
||||||
const auto lastPeer = saved.last();
|
|
||||||
saved.remove(lastDate, lastPeer);
|
|
||||||
|
|
||||||
const auto history = session().data().history(lastPeer);
|
|
||||||
if (!history->chatListTimeId()) {
|
|
||||||
history->setChatListTimeId(ServerTimeFromParsed(lastDate));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Session::addAllSavedPeers() {
|
|
||||||
addSavedPeersAfter(QDateTime());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Session::pinnedChatsCount(Data::Folder *folder) const {
|
int Session::pinnedChatsCount(Data::Folder *folder) const {
|
||||||
|
|
|
@ -305,8 +305,6 @@ public:
|
||||||
const QVector<MTPMessage> &messages,
|
const QVector<MTPMessage> &messages,
|
||||||
const QVector<MTPDialog> &dialogs,
|
const QVector<MTPDialog> &dialogs,
|
||||||
std::optional<int> count = std::nullopt);
|
std::optional<int> count = std::nullopt);
|
||||||
void addSavedPeersAfter(const QDateTime &date);
|
|
||||||
void addAllSavedPeers();
|
|
||||||
|
|
||||||
int pinnedChatsCount(Data::Folder *folder) const;
|
int pinnedChatsCount(Data::Folder *folder) const;
|
||||||
int pinnedChatsLimit(Data::Folder *folder) const;
|
int pinnedChatsLimit(Data::Folder *folder) const;
|
||||||
|
|
|
@ -1426,7 +1426,6 @@ void InnerWidget::removeDialog(Key key) {
|
||||||
session().data().removeChatListEntry(key);
|
session().data().removeChatListEntry(key);
|
||||||
if (const auto history = key.history()) {
|
if (const auto history = key.history()) {
|
||||||
session().notifications().clearFromHistory(history);
|
session().notifications().clearFromHistory(history);
|
||||||
Local::removeSavedPeer(history->peer);
|
|
||||||
}
|
}
|
||||||
const auto i = ranges::find(_filterResults, key, &Row::key);
|
const auto i = ranges::find(_filterResults, key, &Row::key);
|
||||||
if (i != _filterResults.end()) {
|
if (i != _filterResults.end()) {
|
||||||
|
|
|
@ -2257,9 +2257,9 @@ void History::setChatListMessage(HistoryItem *item) {
|
||||||
}
|
}
|
||||||
const auto was = _chatListMessage.value_or(nullptr);
|
const auto was = _chatListMessage.value_or(nullptr);
|
||||||
if (item) {
|
if (item) {
|
||||||
if (!_chatListMessage || !*_chatListMessage) {
|
if (_chatListMessage
|
||||||
Local::removeSavedPeer(peer);
|
&& *_chatListMessage
|
||||||
} else if (!IsServerMsgId((*_chatListMessage)->id)
|
&& !IsServerMsgId((*_chatListMessage)->id)
|
||||||
&& (*_chatListMessage)->date() > item->date()) {
|
&& (*_chatListMessage)->date() > item->date()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3203,7 +3203,6 @@ void MainWidget::start() {
|
||||||
session().api().requestNotifySettings(MTP_inputNotifyChats());
|
session().api().requestNotifySettings(MTP_inputNotifyChats());
|
||||||
session().api().requestNotifySettings(MTP_inputNotifyBroadcasts());
|
session().api().requestNotifySettings(MTP_inputNotifyBroadcasts());
|
||||||
|
|
||||||
Local::readSavedPeers();
|
|
||||||
cSetOtherOnline(0);
|
cSetOtherOnline(0);
|
||||||
session().user()->loadUserpic();
|
session().user()->loadUserpic();
|
||||||
|
|
||||||
|
|
|
@ -86,9 +86,6 @@ bool gIsSnowLeopard = false;
|
||||||
|
|
||||||
int gOtherOnline = 0;
|
int gOtherOnline = 0;
|
||||||
|
|
||||||
SavedPeers gSavedPeers;
|
|
||||||
SavedPeersByTime gSavedPeersByTime;
|
|
||||||
|
|
||||||
ReportSpamStatuses gReportSpamStatuses;
|
ReportSpamStatuses gReportSpamStatuses;
|
||||||
|
|
||||||
int32 gAutoDownloadPhoto = 0; // all auto download
|
int32 gAutoDownloadPhoto = 0; // all auto download
|
||||||
|
|
|
@ -164,12 +164,6 @@ DeclareReadSetting(bool, IsSnowLeopard);
|
||||||
|
|
||||||
DeclareSetting(int, OtherOnline);
|
DeclareSetting(int, OtherOnline);
|
||||||
|
|
||||||
class PeerData;
|
|
||||||
typedef QMap<PeerData*, QDateTime> SavedPeers;
|
|
||||||
typedef QMultiMap<QDateTime, PeerData*> SavedPeersByTime;
|
|
||||||
DeclareRefSetting(SavedPeers, SavedPeers);
|
|
||||||
DeclareRefSetting(SavedPeersByTime, SavedPeersByTime);
|
|
||||||
|
|
||||||
typedef QMap<uint64, DBIPeerReportSpamStatus> ReportSpamStatuses;
|
typedef QMap<uint64, DBIPeerReportSpamStatus> ReportSpamStatuses;
|
||||||
DeclareRefSetting(ReportSpamStatuses, ReportSpamStatuses);
|
DeclareRefSetting(ReportSpamStatuses, ReportSpamStatuses);
|
||||||
|
|
||||||
|
|
|
@ -517,7 +517,7 @@ enum { // Local Storage Keys
|
||||||
lskUserSettings = 0x09, // no data
|
lskUserSettings = 0x09, // no data
|
||||||
lskRecentHashtagsAndBots = 0x0a, // no data
|
lskRecentHashtagsAndBots = 0x0a, // no data
|
||||||
lskStickersOld = 0x0b, // no data
|
lskStickersOld = 0x0b, // no data
|
||||||
lskSavedPeers = 0x0c, // no data
|
lskSavedPeersOld = 0x0c, // no data
|
||||||
lskReportSpamStatuses = 0x0d, // no data
|
lskReportSpamStatuses = 0x0d, // no data
|
||||||
lskSavedGifsOld = 0x0e, // no data
|
lskSavedGifsOld = 0x0e, // no data
|
||||||
lskSavedGifs = 0x0f, // no data
|
lskSavedGifs = 0x0f, // no data
|
||||||
|
@ -686,7 +686,6 @@ bool NoTimeLimit(qint32 storedLimitValue) {
|
||||||
|
|
||||||
FileKey _exportSettingsKey = 0;
|
FileKey _exportSettingsKey = 0;
|
||||||
|
|
||||||
FileKey _savedPeersKey = 0;
|
|
||||||
FileKey _langPackKey = 0;
|
FileKey _langPackKey = 0;
|
||||||
FileKey _languagesKey = 0;
|
FileKey _languagesKey = 0;
|
||||||
|
|
||||||
|
@ -2303,7 +2302,7 @@ ReadMapState _readMap(const QByteArray &pass) {
|
||||||
quint64 installedStickersKey = 0, featuredStickersKey = 0, recentStickersKey = 0, favedStickersKey = 0, archivedStickersKey = 0;
|
quint64 installedStickersKey = 0, featuredStickersKey = 0, recentStickersKey = 0, favedStickersKey = 0, archivedStickersKey = 0;
|
||||||
quint64 savedGifsKey = 0;
|
quint64 savedGifsKey = 0;
|
||||||
quint64 backgroundKeyDay = 0, backgroundKeyNight = 0;
|
quint64 backgroundKeyDay = 0, backgroundKeyNight = 0;
|
||||||
quint64 userSettingsKey = 0, recentHashtagsAndBotsKey = 0, savedPeersKey = 0, exportSettingsKey = 0;
|
quint64 userSettingsKey = 0, recentHashtagsAndBotsKey = 0, exportSettingsKey = 0;
|
||||||
while (!map.stream.atEnd()) {
|
while (!map.stream.atEnd()) {
|
||||||
quint32 keyType;
|
quint32 keyType;
|
||||||
map.stream >> keyType;
|
map.stream >> keyType;
|
||||||
|
@ -2387,8 +2386,9 @@ ReadMapState _readMap(const QByteArray &pass) {
|
||||||
case lskSavedGifs: {
|
case lskSavedGifs: {
|
||||||
map.stream >> savedGifsKey;
|
map.stream >> savedGifsKey;
|
||||||
} break;
|
} break;
|
||||||
case lskSavedPeers: {
|
case lskSavedPeersOld: {
|
||||||
map.stream >> savedPeersKey;
|
quint64 key;
|
||||||
|
map.stream >> key;
|
||||||
} break;
|
} break;
|
||||||
case lskExportSettings: {
|
case lskExportSettings: {
|
||||||
map.stream >> exportSettingsKey;
|
map.stream >> exportSettingsKey;
|
||||||
|
@ -2416,7 +2416,6 @@ ReadMapState _readMap(const QByteArray &pass) {
|
||||||
_favedStickersKey = favedStickersKey;
|
_favedStickersKey = favedStickersKey;
|
||||||
_archivedStickersKey = archivedStickersKey;
|
_archivedStickersKey = archivedStickersKey;
|
||||||
_savedGifsKey = savedGifsKey;
|
_savedGifsKey = savedGifsKey;
|
||||||
_savedPeersKey = savedPeersKey;
|
|
||||||
_backgroundKeyDay = backgroundKeyDay;
|
_backgroundKeyDay = backgroundKeyDay;
|
||||||
_backgroundKeyNight = backgroundKeyNight;
|
_backgroundKeyNight = backgroundKeyNight;
|
||||||
_userSettingsKey = userSettingsKey;
|
_userSettingsKey = userSettingsKey;
|
||||||
|
@ -2520,7 +2519,6 @@ void _writeMap(WriteMapWhen when) {
|
||||||
}
|
}
|
||||||
if (_favedStickersKey) mapSize += sizeof(quint32) + sizeof(quint64);
|
if (_favedStickersKey) mapSize += sizeof(quint32) + sizeof(quint64);
|
||||||
if (_savedGifsKey) mapSize += sizeof(quint32) + sizeof(quint64);
|
if (_savedGifsKey) mapSize += sizeof(quint32) + sizeof(quint64);
|
||||||
if (_savedPeersKey) mapSize += sizeof(quint32) + sizeof(quint64);
|
|
||||||
if (_backgroundKeyDay || _backgroundKeyNight) mapSize += sizeof(quint32) + sizeof(quint64) + sizeof(quint64);
|
if (_backgroundKeyDay || _backgroundKeyNight) mapSize += sizeof(quint32) + sizeof(quint64) + sizeof(quint64);
|
||||||
if (_userSettingsKey) mapSize += sizeof(quint32) + sizeof(quint64);
|
if (_userSettingsKey) mapSize += sizeof(quint32) + sizeof(quint64);
|
||||||
if (_recentHashtagsAndBotsKey) mapSize += sizeof(quint32) + sizeof(quint64);
|
if (_recentHashtagsAndBotsKey) mapSize += sizeof(quint32) + sizeof(quint64);
|
||||||
|
@ -2564,9 +2562,6 @@ void _writeMap(WriteMapWhen when) {
|
||||||
if (_savedGifsKey) {
|
if (_savedGifsKey) {
|
||||||
mapData.stream << quint32(lskSavedGifs) << quint64(_savedGifsKey);
|
mapData.stream << quint32(lskSavedGifs) << quint64(_savedGifsKey);
|
||||||
}
|
}
|
||||||
if (_savedPeersKey) {
|
|
||||||
mapData.stream << quint32(lskSavedPeers) << quint64(_savedPeersKey);
|
|
||||||
}
|
|
||||||
if (_backgroundKeyDay || _backgroundKeyNight) {
|
if (_backgroundKeyDay || _backgroundKeyNight) {
|
||||||
mapData.stream
|
mapData.stream
|
||||||
<< quint32(lskBackground)
|
<< quint32(lskBackground)
|
||||||
|
@ -2843,7 +2838,7 @@ void reset() {
|
||||||
_savedGifsKey = 0;
|
_savedGifsKey = 0;
|
||||||
_backgroundKeyDay = _backgroundKeyNight = 0;
|
_backgroundKeyDay = _backgroundKeyNight = 0;
|
||||||
Window::Theme::Background()->reset();
|
Window::Theme::Background()->reset();
|
||||||
_userSettingsKey = _recentHashtagsAndBotsKey = _savedPeersKey = _exportSettingsKey = 0;
|
_userSettingsKey = _recentHashtagsAndBotsKey = _exportSettingsKey = 0;
|
||||||
_oldMapVersion = _oldSettingsVersion = 0;
|
_oldMapVersion = _oldSettingsVersion = 0;
|
||||||
_cacheTotalSizeLimit = Database::Settings().totalSizeLimit;
|
_cacheTotalSizeLimit = Database::Settings().totalSizeLimit;
|
||||||
_cacheTotalTimeLimit = Database::Settings().totalTimeLimit;
|
_cacheTotalTimeLimit = Database::Settings().totalTimeLimit;
|
||||||
|
@ -2892,7 +2887,6 @@ base::flat_set<QString> CollectGoodNames() {
|
||||||
_backgroundKeyDay,
|
_backgroundKeyDay,
|
||||||
_recentHashtagsAndBotsKey,
|
_recentHashtagsAndBotsKey,
|
||||||
_exportSettingsKey,
|
_exportSettingsKey,
|
||||||
_savedPeersKey,
|
|
||||||
_trustedBotsKey
|
_trustedBotsKey
|
||||||
};
|
};
|
||||||
auto result = base::flat_set<QString>{ "map0", "map1" };
|
auto result = base::flat_set<QString>{ "map0", "map1" };
|
||||||
|
@ -4817,104 +4811,6 @@ Export::Settings ReadExportSettings() {
|
||||||
: Export::Settings();
|
: Export::Settings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeSavedPeers() {
|
|
||||||
if (!_working()) return;
|
|
||||||
|
|
||||||
const SavedPeers &saved(cSavedPeers());
|
|
||||||
if (saved.isEmpty()) {
|
|
||||||
if (_savedPeersKey) {
|
|
||||||
clearKey(_savedPeersKey);
|
|
||||||
_savedPeersKey = 0;
|
|
||||||
_mapChanged = true;
|
|
||||||
}
|
|
||||||
_writeMap();
|
|
||||||
} else {
|
|
||||||
if (!_savedPeersKey) {
|
|
||||||
_savedPeersKey = genKey();
|
|
||||||
_mapChanged = true;
|
|
||||||
_writeMap(WriteMapWhen::Fast);
|
|
||||||
}
|
|
||||||
quint32 size = sizeof(quint32);
|
|
||||||
for (SavedPeers::const_iterator i = saved.cbegin(); i != saved.cend(); ++i) {
|
|
||||||
size += Serialize::peerSize(i.key()) + Serialize::dateTimeSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
EncryptedDescriptor data(size);
|
|
||||||
data.stream << quint32(saved.size());
|
|
||||||
for (SavedPeers::const_iterator i = saved.cbegin(); i != saved.cend(); ++i) {
|
|
||||||
Serialize::writePeer(data.stream, i.key());
|
|
||||||
data.stream << i.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
FileWriteDescriptor file(_savedPeersKey);
|
|
||||||
file.writeEncrypted(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void readSavedPeers() {
|
|
||||||
if (!_savedPeersKey) return;
|
|
||||||
|
|
||||||
FileReadDescriptor saved;
|
|
||||||
if (!readEncryptedFile(saved, _savedPeersKey)) {
|
|
||||||
clearKey(_savedPeersKey);
|
|
||||||
_savedPeersKey = 0;
|
|
||||||
_writeMap();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (saved.version == 9011) { // broken dev version
|
|
||||||
clearKey(_savedPeersKey);
|
|
||||||
_savedPeersKey = 0;
|
|
||||||
_writeMap();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
quint32 count = 0;
|
|
||||||
saved.stream >> count;
|
|
||||||
cRefSavedPeers().clear();
|
|
||||||
cRefSavedPeersByTime().clear();
|
|
||||||
QList<PeerData*> peers;
|
|
||||||
peers.reserve(count);
|
|
||||||
for (uint32 i = 0; i < count; ++i) {
|
|
||||||
const auto peer = Serialize::readPeer(saved.version, saved.stream);
|
|
||||||
if (!peer) break;
|
|
||||||
|
|
||||||
QDateTime t;
|
|
||||||
saved.stream >> t;
|
|
||||||
|
|
||||||
cRefSavedPeers().insert(peer, t);
|
|
||||||
cRefSavedPeersByTime().insert(t, peer);
|
|
||||||
peers.push_back(peer);
|
|
||||||
}
|
|
||||||
|
|
||||||
Auth().api().requestPeers(peers);
|
|
||||||
}
|
|
||||||
|
|
||||||
void addSavedPeer(PeerData *peer, const QDateTime &position) {
|
|
||||||
auto &savedPeers = cRefSavedPeers();
|
|
||||||
auto i = savedPeers.find(peer);
|
|
||||||
if (i == savedPeers.cend()) {
|
|
||||||
savedPeers.insert(peer, position);
|
|
||||||
} else if (i.value() != position) {
|
|
||||||
cRefSavedPeersByTime().remove(i.value(), peer);
|
|
||||||
i.value() = position;
|
|
||||||
cRefSavedPeersByTime().insert(i.value(), peer);
|
|
||||||
}
|
|
||||||
writeSavedPeers();
|
|
||||||
}
|
|
||||||
|
|
||||||
void removeSavedPeer(PeerData *peer) {
|
|
||||||
auto &savedPeers = cRefSavedPeers();
|
|
||||||
if (savedPeers.isEmpty()) return;
|
|
||||||
|
|
||||||
auto i = savedPeers.find(peer);
|
|
||||||
if (i != savedPeers.cend()) {
|
|
||||||
cRefSavedPeersByTime().remove(i.value(), peer);
|
|
||||||
savedPeers.erase(i);
|
|
||||||
|
|
||||||
writeSavedPeers();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void writeReportSpamStatuses() {
|
void writeReportSpamStatuses() {
|
||||||
_writeReportSpamStatuses();
|
_writeReportSpamStatuses();
|
||||||
}
|
}
|
||||||
|
@ -5073,10 +4969,6 @@ bool ClearManager::addTask(int task) {
|
||||||
_recentHashtagsAndBotsKey = 0;
|
_recentHashtagsAndBotsKey = 0;
|
||||||
_mapChanged = true;
|
_mapChanged = true;
|
||||||
}
|
}
|
||||||
if (_savedPeersKey) {
|
|
||||||
_savedPeersKey = 0;
|
|
||||||
_mapChanged = true;
|
|
||||||
}
|
|
||||||
_writeMap();
|
_writeMap();
|
||||||
} else {
|
} else {
|
||||||
for (int32 i = 0, l = data->tasks.size(); i < l; ++i) {
|
for (int32 i = 0, l = data->tasks.size(); i < l; ++i) {
|
||||||
|
|
|
@ -168,10 +168,6 @@ void saveRecentSearchHashtags(const QString &text);
|
||||||
void WriteExportSettings(const Export::Settings &settings);
|
void WriteExportSettings(const Export::Settings &settings);
|
||||||
Export::Settings ReadExportSettings();
|
Export::Settings ReadExportSettings();
|
||||||
|
|
||||||
void addSavedPeer(PeerData *peer, const QDateTime &position);
|
|
||||||
void removeSavedPeer(PeerData *peer);
|
|
||||||
void readSavedPeers();
|
|
||||||
|
|
||||||
void writeReportSpamStatuses();
|
void writeReportSpamStatuses();
|
||||||
|
|
||||||
void writeSelf();
|
void writeSelf();
|
||||||
|
|
Loading…
Reference in New Issue