Skip to content

Commit

Permalink
Add clearHistory functions
Browse files Browse the repository at this point in the history
Add support to caching Me details
  • Loading branch information
Bardia Daneshvar committed Jun 30, 2016
1 parent 33bd14f commit 404adf3
Show file tree
Hide file tree
Showing 9 changed files with 196 additions and 4 deletions.
26 changes: 25 additions & 1 deletion plugins.qmltypes
Expand Up @@ -3216,6 +3216,21 @@ Module {
type: "int"
Parameter { name: "peer"; type: "InputPeerObject"; isPointer: true }
}
Method {
name: "clearHistory"
Parameter { name: "peer"; type: "InputPeerObject"; isPointer: true }
Parameter { name: "justClear"; type: "bool" }
Parameter { name: "callback"; type: "QJSValue" }
}
Method {
name: "clearHistory"
Parameter { name: "peer"; type: "InputPeerObject"; isPointer: true }
Parameter { name: "justClear"; type: "bool" }
}
Method {
name: "clearHistory"
Parameter { name: "peer"; type: "InputPeerObject"; isPointer: true }
}
}
Component {
name: "TelegramDownloadHandler"
Expand Down Expand Up @@ -3599,6 +3614,15 @@ Module {
Parameter { name: "callback"; type: "QJSValue" }
}
Method { name: "markAsRead" }
Method {
name: "clearHistory"
Parameter { name: "justClear"; type: "bool" }
Parameter { name: "callback"; type: "QJSValue" }
}
Method {
name: "clearHistory"
Parameter { name: "justClear"; type: "bool" }
}
Method {
name: "loadFrom"
Parameter { name: "msgId"; type: "int" }
Expand Down Expand Up @@ -3656,7 +3680,7 @@ Module {
Property { name: "mute"; type: "bool" }
Property { name: "blocked"; type: "bool" }
Property { name: "joined"; type: "bool" }
Property { name: "refreshing"; type: "bool" }
Property { name: "refreshing"; type: "bool"; isReadonly: true }
Property { name: "userFull"; type: "UserFullObject"; isReadonly: true; isPointer: true }
Property { name: "chatFull"; type: "ChatFullObject"; isReadonly: true; isPointer: true }
Property { name: "chatUsers"; type: "QVariantList"; isReadonly: true }
Expand Down
8 changes: 6 additions & 2 deletions telegramabstractenginelistmodel.h
Expand Up @@ -10,6 +10,7 @@
#include <QPointer>

#include <functional>
#include <telegram.h>

class UpdatesType;
class Peer;
Expand Down Expand Up @@ -40,6 +41,10 @@ class TELEGRAMQMLSHARED_EXPORT TelegramAbstractEngineListModel : public Telegram
return QStringList();
}

Telegram *telegram() const {
return mTelegram;
}

public Q_SLOTS:
void startTimer(int ms, Callback callback);

Expand All @@ -59,8 +64,7 @@ public Q_SLOTS:

virtual void timerEvent(QTimerEvent *e);

private:
void connectTelegram();
virtual void connectTelegram();

private:
QString mErrorText;
Expand Down
25 changes: 25 additions & 0 deletions telegramcache.cpp
Expand Up @@ -275,6 +275,18 @@ void TelegramCache::insert(const Dialog &dialog)
Q_UNUSED(dialog)
}

void TelegramCache::insertMe(const UserFull &user)
{
QDir().mkpath(p->path);
writeMap(p->path + "/me", user.toMap());
}

UserFull TelegramCache::readMe() const
{
const QMap<QString, QVariant> &map = readMap(p->path + "/me");
return UserFull::fromMap(map);
}

void TelegramCache::insert(const Message &msg)
{
const QString folderPath = getMessageFolder(TelegramTools::messagePeer(msg));
Expand Down Expand Up @@ -366,6 +378,19 @@ void TelegramCache::deleteMessage(const Peer &peer, int msgId)
zeroFile(messageFile);
}

void TelegramCache::deleteMessages(const InputPeer &peer)
{
return deleteMessages(TelegramTools::inputPeerPeer(peer));
}

void TelegramCache::deleteMessages(const Peer &peer)
{
const QString &messageFolder = getMessageFolder(peer);
const QStringList &files = QDir(messageFolder).entryList(QDir::Files);
Q_FOREACH(const QString &f, files)
zeroFile(messageFolder + "/" + f);
}

Chat TelegramCache::readChat(const InputPeer &peer) const
{
return readChat(TelegramTools::inputPeerPeer(peer));
Expand Down
6 changes: 6 additions & 0 deletions telegramcache.h
Expand Up @@ -50,12 +50,18 @@ class TELEGRAMQMLSHARED_EXPORT TelegramCache : public TqObject
void insert(const QList<Dialog> &dialogs);
void insert(const Dialog &dialog);

void insertMe(const UserFull &user);
UserFull readMe() const;

MessagesMessages readMessages(const InputPeer &peer, int offset, int limit) const;
MessagesMessages readMessages(const Peer &peer, int offset, int limit) const;

void deleteMessage(const InputPeer &peer, int msgId);
void deleteMessage(const Peer &peer, int msgId);

void deleteMessages(const InputPeer &peer);
void deleteMessages(const Peer &peer);

Chat readChat(const InputPeer &peer) const;
Chat readChat(const Peer &peer) const;

Expand Down
61 changes: 61 additions & 0 deletions telegramdialoglistmodel.cpp
Expand Up @@ -507,6 +507,29 @@ int TelegramDialogListModel::indexOf(InputPeerObject *peer)
return p->list.indexOf( TelegramTools::identifier(peer->core()) );
}

void TelegramDialogListModel::clearHistory(InputPeerObject *peer, bool justClear, const QJSValue &callback)
{
if(!mEngine || !mEngine->telegram() || !peer)
return;
if(mEngine->state() != TelegramEngine::AuthLoggedIn)
return;

const InputPeer &input = peer->core();
Telegram *tg = mEngine->telegram();
DEFINE_DIS;
tg->messagesDeleteHistory(justClear, input, 0, [this, dis, input, callback](TG_MESSAGES_DELETE_HISTORY_CALLBACK){
Q_UNUSED(msgId)
Q_UNUSED(result)
if(!dis || !mEngine) return;
if(!error.null) {
setError(error.errorText, error.errorCode);
return;
}
if(callback.isCallable())
QJSValue(callback).call();
});
}

void TelegramDialogListModel::refresh()
{
if(!mEngine || !mEngine->telegram())
Expand Down Expand Up @@ -1385,6 +1408,19 @@ QString TelegramDialogListModel::messageText(MessageObject *msg) const
}
}

void TelegramDialogListModel::connectTelegram()
{
if(telegram() == mEngine->telegram())
return;

if(telegram())
disconnect(telegram(), &Telegram::messagesDeleteHistoryAnswer, this, &TelegramDialogListModel::clearHistoryAnswer);
if(mEngine->telegram())
connect(mEngine->telegram(), &Telegram::messagesDeleteHistoryAnswer, this, &TelegramDialogListModel::clearHistoryAnswer);

TelegramAbstractEngineListModel::connectTelegram();
}

void TelegramDialogListModel::setRefreshing(bool stt)
{
if(p->refreshing == stt)
Expand All @@ -1394,6 +1430,31 @@ void TelegramDialogListModel::setRefreshing(bool stt)
Q_EMIT refreshingChanged();
}

void TelegramDialogListModel::clearHistoryAnswer(qint64 msgId, const MessagesAffectedHistory &result)
{
Q_UNUSED(msgId)
Q_UNUSED(result)
if(!mEngine || !mEngine->telegram())
return;
if(mEngine->state() != TelegramEngine::AuthLoggedIn)
return;

Telegram *tg = mEngine->telegram();
const InputPeer &peer = tg->lastArguments().value("peer").value<InputPeer>();
const QByteArray &key = TelegramTools::identifier(peer);
if(!p->items.contains(key))
return;

TelegramDialogListItem &item = p->items[key];
item.topMessage = 0;
item.topMessageUser = 0;

PROCESS_ROW_CHANGE(key, << RoleMessage << RoleMessageDate << RoleMessageOut
<< RoleMessageType << RoleMessageUnread
<< RoleMessageUser << RoleTopMessageItem);
item.dialog->setUnreadCount(0);
}

TelegramDialogListModel::~TelegramDialogListModel()
{
TelegramDialogListModelPrivate *tmp = p;
Expand Down
5 changes: 5 additions & 0 deletions telegramdialoglistmodel.h
Expand Up @@ -124,6 +124,7 @@ class TELEGRAMQMLSHARED_EXPORT TelegramDialogListModel : public TelegramAbstract

public Q_SLOTS:
int indexOf(InputPeerObject *peer);
void clearHistory(InputPeerObject *peer, bool justClear = false, const QJSValue &callback = QJSValue());

protected:
void refresh();
Expand All @@ -136,6 +137,8 @@ public Q_SLOTS:
virtual QString convertDate(const QDateTime &td) const;
virtual QString messageText(class MessageObject *msg) const;

virtual void connectTelegram();

private:
void getDialogsFromServer(const class InputPeer &offset, int limit, QHash<QByteArray, TelegramDialogListItem> *items = 0);
void getContactsFromServer();
Expand All @@ -153,6 +156,8 @@ public Q_SLOTS:
void insertUpdate(const Update &update);
void setRefreshing(bool stt);

void clearHistoryAnswer(qint64 msgId, const MessagesAffectedHistory &result);

private:
TelegramDialogListModelPrivate *p;
};
Expand Down
6 changes: 6 additions & 0 deletions telegramengine.cpp
Expand Up @@ -108,6 +108,7 @@ TelegramEngine::TelegramEngine(QObject *parent) :
p->initTimer = 0;
p->sharedData = new TelegramSharedDataManager(this);
p->tempPath = QDir::tempPath() + "/" + QCoreApplication::applicationName();
p->our = new UserFullObject();

setApp(new TelegramApp(this));
setHost(new TelegramHost(this));
Expand Down Expand Up @@ -370,6 +371,10 @@ void TelegramEngine::tryInit()
clean();
if(!isValid())
return;
if(p->cache) {
p->our = new UserFullObject( p->cache->readMe() );
Q_EMIT ourChanged();
}

QString publicKeyPath = p->host->publicKey().toLocalFile();
if(publicKeyPath.isEmpty())
Expand Down Expand Up @@ -402,6 +407,7 @@ void TelegramEngine::tryInit()
Q_UNUSED(msgId)
Q_UNUSED(error)
p->our = new UserFullObject(result);
p->cache->insertMe(result);
setState(AuthLoggedIn);
Q_EMIT ourChanged();
Q_EMIT authLoggedIn();
Expand Down
58 changes: 57 additions & 1 deletion telegrammessagelistmodel.cpp
Expand Up @@ -901,7 +901,7 @@ void TelegramMessageListModel::markAsRead(const QJSValue &callback)
}
else
{
tg->messagesReadHistory(input, 0, [this, dis, input, tsdm](TG_MESSAGES_READ_HISTORY_CALLBACK){
tg->messagesReadHistory(input, 0, [this, dis, input, tsdm, callback](TG_MESSAGES_READ_HISTORY_CALLBACK){
Q_UNUSED(msgId)
if(!dis) return;
if(!error.null) {
Expand All @@ -915,10 +915,53 @@ void TelegramMessageListModel::markAsRead(const QJSValue &callback)
TelegramSharedPointer<DialogObject> dialog = tsdm->getDialog(key);
if(dialog)
dialog->setUnreadCount(0);
if(callback.isCallable())
QJSValue(callback).call();
});
}
}

void TelegramMessageListModel::clearHistory(bool justClear, const QJSValue &callback)
{
if(!mEngine || !mEngine->telegram() || !p->currentPeer)
return;
if(mEngine->state() != TelegramEngine::AuthLoggedIn)
return;

const InputPeer &input = p->currentPeer->core();
Telegram *tg = mEngine->telegram();
DEFINE_DIS;
tg->messagesDeleteHistory(justClear, input, 0, [this, dis, input, callback](TG_MESSAGES_DELETE_HISTORY_CALLBACK){
Q_UNUSED(msgId)
Q_UNUSED(result)
if(!dis || !mEngine) return;
if(!error.null) {
setError(error.errorText, error.errorCode);
return;
}
if(callback.isCallable())
QJSValue(callback).call();
});
}

void TelegramMessageListModel::clearHistoryAnswer(qint64 msgId, const MessagesAffectedHistory &result)
{
Q_UNUSED(msgId)
Q_UNUSED(result)
if(!mEngine || !mEngine->telegram() || !p->currentPeer)
return;
if(mEngine->state() != TelegramEngine::AuthLoggedIn)
return;

Telegram *tg = mEngine->telegram();
const InputPeer &peer = tg->lastArguments().value("peer").value<InputPeer>();
if(!p->currentPeer || !(p->currentPeer->core() == peer))
return;

mEngine->cache()->deleteMessages(peer);
clean();
}

void TelegramMessageListModel::loadFrom(qint32 msgId)
{
if(!p->currentPeer || !mEngine)
Expand Down Expand Up @@ -1088,6 +1131,19 @@ void TelegramMessageListModel::timerEvent(QTimerEvent *e)
TelegramAbstractEngineListModel::timerEvent(e);
}

void TelegramMessageListModel::connectTelegram()
{
if(telegram() == mEngine->telegram())
return;

if(telegram())
disconnect(telegram(), &Telegram::messagesDeleteHistoryAnswer, this, &TelegramMessageListModel::clearHistoryAnswer);
if(mEngine->telegram())
connect(mEngine->telegram(), &Telegram::messagesDeleteHistoryAnswer, this, &TelegramMessageListModel::clearHistoryAnswer);

TelegramAbstractEngineListModel::connectTelegram();
}

void TelegramMessageListModel::getMessagesFromServer(int offsetId, int addOffset, int limit)
{
if(mEngine->state() != TelegramEngine::AuthLoggedIn)
Expand Down
5 changes: 5 additions & 0 deletions telegrammessagelistmodel.h
Expand Up @@ -6,6 +6,7 @@
#include "telegramabstractenginelistmodel.h"

#include <QJSValue>
#include <telegram.h>

class ReplyMarkupObject;
class MessageObject;
Expand Down Expand Up @@ -130,6 +131,7 @@ public Q_SLOTS:
void resendMessage(qint32 msgId, const QString &newCaption = QString(), const QJSValue &callback = QJSValue());
void sendSticker(DocumentObject *doc, MessageObject *replyTo = 0, ReplyMarkupObject *replyMarkup = 0, const QJSValue &callback = QJSValue());
void markAsRead(const QJSValue &callback = QJSValue());
void clearHistory(bool justClear, const QJSValue &callback = QJSValue());

virtual void loadFrom(qint32 msgId);
virtual void loadBack();
Expand All @@ -148,6 +150,7 @@ public Q_SLOTS:
virtual QString convertDate(const QDateTime &td) const;

void timerEvent(QTimerEvent *e);
virtual void connectTelegram();

private:
void getMessagesFromServer(int offsetId, int addOffset, int limit);
Expand All @@ -168,6 +171,8 @@ public Q_SLOTS:

void insertUpdate(const Update &update);

void clearHistoryAnswer(qint64 msgId, const MessagesAffectedHistory &result);

private:
TelegramMessageListModelPrivate *p;
};
Expand Down

0 comments on commit 404adf3

Please sign in to comment.