tdesktop/Telegram/SourceFiles/inline_bots/inline_bot_send_data.h

246 lines
6.2 KiB
C++

/*
This file is part of Telegram Desktop,
the official desktop version of Telegram messaging app, see https://telegram.org
Telegram Desktop is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
It is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
In addition, as a special exception, the copyright holders give permission
to link the code of portions of this program with the OpenSSL library.
Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
*/
#pragma once
#include "core/basic_types.h"
#include "structs.h"
#include "mtproto/core_types.h"
#include "history/history_location_manager.h"
namespace InlineBots {
class Result;
namespace internal {
// Abstract class describing the message that will be
// sent if the user chooses this inline bot result.
// For each type of message that can be sent there will be a subclass.
class SendData {
public:
SendData() = default;
SendData(const SendData &other) = delete;
SendData &operator=(const SendData &other) = delete;
virtual ~SendData() = default;
virtual bool isValid() const = 0;
virtual void addToHistory(const Result *owner, History *history,
MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate,
UserId viaBotId, MsgId replyToId, const MTPReplyMarkup &markup) const = 0;
virtual bool hasLocationCoords() const {
return false;
}
virtual bool getLocationCoords(LocationCoords *outLocation) const {
return false;
}
virtual QString getLayoutTitle(const Result *owner) const;
virtual QString getLayoutDescription(const Result *owner) const;
};
// This class implements addHistory() for most of the types hiding
// the differences in getSentMessageFields() method.
// Only SendFile and SendPhoto work by their own.
class SendDataCommon : public SendData {
public:
struct SentMTPMessageFields {
MTPString text = MTP_string("");
MTPVector<MTPMessageEntity> entities = MTPnullEntities;
MTPMessageMedia media = MTP_messageMediaEmpty();
};
virtual SentMTPMessageFields getSentMessageFields() const = 0;
void addToHistory(const Result *owner, History *history,
MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate,
UserId viaBotId, MsgId replyToId, const MTPReplyMarkup &markup) const override;
};
// Plain text message.
class SendText : public SendDataCommon {
public:
SendText(const QString &message, const EntitiesInText &entities, bool/* noWebPage*/)
: _message(message)
, _entities(entities) {
}
bool isValid() const override {
return !_message.isEmpty();
}
SentMTPMessageFields getSentMessageFields() const override;
private:
QString _message;
EntitiesInText _entities;
};
// Message with geo location point media.
class SendGeo : public SendDataCommon {
public:
explicit SendGeo(const MTPDgeoPoint &point) : _location(point) {
}
bool isValid() const override {
return true;
}
SentMTPMessageFields getSentMessageFields() const override;
bool hasLocationCoords() const override {
return true;
}
bool getLocationCoords(LocationCoords *outLocation) const override {
t_assert(outLocation != nullptr);
*outLocation = _location;
return true;
}
private:
LocationCoords _location;
};
// Message with venue media.
class SendVenue : public SendDataCommon {
public:
SendVenue(const MTPDgeoPoint &point, const QString &venueId,
const QString &provider, const QString &title, const QString &address)
: _location(point)
, _venueId(venueId)
, _provider(provider)
, _title(title)
, _address(address) {
}
bool isValid() const override {
return true;
}
SentMTPMessageFields getSentMessageFields() const override;
bool hasLocationCoords() const override {
return true;
}
bool getLocationCoords(LocationCoords *outLocation) const override {
t_assert(outLocation != nullptr);
*outLocation = _location;
return true;
}
private:
LocationCoords _location;
QString _venueId, _provider, _title, _address;
};
// Message with shared contact media.
class SendContact : public SendDataCommon {
public:
SendContact(const QString &firstName, const QString &lastName, const QString &phoneNumber)
: _firstName(firstName)
, _lastName(lastName)
, _phoneNumber(phoneNumber) {
}
bool isValid() const override {
return (!_firstName.isEmpty() || !_lastName.isEmpty()) && !_phoneNumber.isEmpty();
}
SentMTPMessageFields getSentMessageFields() const override;
QString getLayoutDescription(const Result *owner) const override;
private:
QString _firstName, _lastName, _phoneNumber;
};
// Message with photo.
class SendPhoto : public SendData {
public:
SendPhoto(PhotoData *photo, const QString &caption)
: _photo(photo)
, _caption(caption) {
}
bool isValid() const override {
return _photo != nullptr;
}
void addToHistory(const Result *owner, History *history,
MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate,
UserId viaBotId, MsgId replyToId, const MTPReplyMarkup &markup) const override;
private:
PhotoData *_photo;
QString _caption;
};
// Message with file.
class SendFile : public SendData {
public:
SendFile(DocumentData *document, const QString &caption)
: _document(document)
, _caption(caption) {
}
bool isValid() const override {
return _document != nullptr;
}
void addToHistory(const Result *owner, History *history,
MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate,
UserId viaBotId, MsgId replyToId, const MTPReplyMarkup &markup) const override;
private:
DocumentData *_document;
QString _caption;
};
// Message with game.
class SendGame : public SendData {
public:
SendGame(GameData *game)
: _game(game) {
}
bool isValid() const override {
return _game != nullptr;
}
void addToHistory(const Result *owner, History *history,
MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate,
UserId viaBotId, MsgId replyToId, const MTPReplyMarkup &markup) const override;
private:
GameData *_game;
};
} // namespace internal
} // namespace InlineBots