mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-06 15:13:57 +02:00
Added support of giveaway results messages to export to HTML.
This commit is contained in:
parent
064bab60ff
commit
00ad32c5f4
4 changed files with 138 additions and 4 deletions
|
@ -753,6 +753,30 @@ GiveawayStart ParseGiveaway(const MTPDmessageMediaGiveaway &data) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GiveawayResults ParseGiveaway(const MTPDmessageMediaGiveawayResults &data) {
|
||||||
|
const auto additional = data.vadditional_peers_count();
|
||||||
|
auto result = GiveawayResults{
|
||||||
|
.channel = ChannelId(data.vchannel_id()),
|
||||||
|
.untilDate = data.vuntil_date().v,
|
||||||
|
.launchId = data.vlaunch_msg_id().v,
|
||||||
|
.additionalPeersCount = additional.value_or_empty(),
|
||||||
|
.winnersCount = data.vwinners_count().v,
|
||||||
|
.unclaimedCount = data.vunclaimed_count().v,
|
||||||
|
.months = data.vmonths().value_or_empty(),
|
||||||
|
.credits = data.vstars().value_or_empty(),
|
||||||
|
.refunded = data.is_refunded(),
|
||||||
|
.all = !data.is_only_new_subscribers(),
|
||||||
|
};
|
||||||
|
result.winners.reserve(data.vwinners().v.size());
|
||||||
|
for (const auto &id : data.vwinners().v) {
|
||||||
|
result.winners.push_back(UserId(id));
|
||||||
|
}
|
||||||
|
if (const auto additional = data.vprize_description()) {
|
||||||
|
result.additionalPrize = qs(*additional);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
UserpicsSlice ParseUserpicsSlice(
|
UserpicsSlice ParseUserpicsSlice(
|
||||||
const MTPVector<MTPPhoto> &data,
|
const MTPVector<MTPPhoto> &data,
|
||||||
int baseIndex) {
|
int baseIndex) {
|
||||||
|
@ -1257,7 +1281,7 @@ Media ParseMedia(
|
||||||
}, [&](const MTPDmessageMediaGiveaway &data) {
|
}, [&](const MTPDmessageMediaGiveaway &data) {
|
||||||
result.content = ParseGiveaway(data);
|
result.content = ParseGiveaway(data);
|
||||||
}, [&](const MTPDmessageMediaGiveawayResults &data) {
|
}, [&](const MTPDmessageMediaGiveawayResults &data) {
|
||||||
// #TODO export giveaway
|
result.content = ParseGiveaway(data);
|
||||||
}, [&](const MTPDmessageMediaPaidMedia &data) {
|
}, [&](const MTPDmessageMediaPaidMedia &data) {
|
||||||
result.content = ParsePaidMedia(context, data, folder, date);
|
result.content = ParsePaidMedia(context, data, folder, date);
|
||||||
}, [](const MTPDmessageMediaEmpty &data) {});
|
}, [](const MTPDmessageMediaEmpty &data) {});
|
||||||
|
|
|
@ -220,6 +220,21 @@ struct GiveawayStart {
|
||||||
bool all = false;
|
bool all = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GiveawayResults {
|
||||||
|
ChannelId channel = 0;
|
||||||
|
std::vector<PeerId> winners;
|
||||||
|
QString additionalPrize;
|
||||||
|
TimeId untilDate = 0;
|
||||||
|
int32 launchId = 0;
|
||||||
|
int additionalPeersCount = 0;
|
||||||
|
int winnersCount = 0;
|
||||||
|
int unclaimedCount = 0;
|
||||||
|
int months = 0;
|
||||||
|
uint64 credits = 0;
|
||||||
|
bool refunded = false;
|
||||||
|
bool all = false;
|
||||||
|
};
|
||||||
|
|
||||||
struct UserpicsSlice {
|
struct UserpicsSlice {
|
||||||
std::vector<Photo> list;
|
std::vector<Photo> list;
|
||||||
};
|
};
|
||||||
|
@ -353,6 +368,7 @@ struct Media {
|
||||||
Invoice,
|
Invoice,
|
||||||
Poll,
|
Poll,
|
||||||
GiveawayStart,
|
GiveawayStart,
|
||||||
|
GiveawayResults,
|
||||||
PaidMedia,
|
PaidMedia,
|
||||||
UnsupportedMedia> content;
|
UnsupportedMedia> content;
|
||||||
TimeId ttl = 0;
|
TimeId ttl = 0;
|
||||||
|
|
|
@ -598,7 +598,8 @@ private:
|
||||||
const Data::Message &message,
|
const Data::Message &message,
|
||||||
const QString &basePath,
|
const QString &basePath,
|
||||||
const PeersMap &peers,
|
const PeersMap &peers,
|
||||||
const QString &internalLinksDomain);
|
const QString &internalLinksDomain,
|
||||||
|
Fn<QByteArray(int messageId, QByteArray text)> wrapMessageLink);
|
||||||
[[nodiscard]] QByteArray pushGenericMedia(const MediaData &data);
|
[[nodiscard]] QByteArray pushGenericMedia(const MediaData &data);
|
||||||
[[nodiscard]] QByteArray pushStickerMedia(
|
[[nodiscard]] QByteArray pushStickerMedia(
|
||||||
const Data::Document &data,
|
const Data::Document &data,
|
||||||
|
@ -616,6 +617,10 @@ private:
|
||||||
[[nodiscard]] QByteArray pushGiveaway(
|
[[nodiscard]] QByteArray pushGiveaway(
|
||||||
const PeersMap &peers,
|
const PeersMap &peers,
|
||||||
const Data::GiveawayStart &data);
|
const Data::GiveawayStart &data);
|
||||||
|
[[nodiscard]] QByteArray pushGiveaway(
|
||||||
|
const PeersMap &peers,
|
||||||
|
const Data::GiveawayResults &data,
|
||||||
|
Fn<QByteArray(int messageId, QByteArray text)> wrapMessageLink);
|
||||||
|
|
||||||
File _file;
|
File _file;
|
||||||
QByteArray _composedStart;
|
QByteArray _composedStart;
|
||||||
|
@ -1456,7 +1461,13 @@ auto HtmlWriter::Wrap::pushMessage(
|
||||||
block.append(popTag());
|
block.append(popTag());
|
||||||
}
|
}
|
||||||
|
|
||||||
block.append(pushMedia(message, basePath, peers, internalLinksDomain));
|
block.append(
|
||||||
|
pushMedia(
|
||||||
|
message,
|
||||||
|
basePath,
|
||||||
|
peers,
|
||||||
|
internalLinksDomain,
|
||||||
|
wrapMessageLink));
|
||||||
|
|
||||||
const auto text = FormatText(message.text, internalLinksDomain, _base);
|
const auto text = FormatText(message.text, internalLinksDomain, _base);
|
||||||
if (!text.isEmpty()) {
|
if (!text.isEmpty()) {
|
||||||
|
@ -1559,7 +1570,8 @@ QByteArray HtmlWriter::Wrap::pushMedia(
|
||||||
const Data::Message &message,
|
const Data::Message &message,
|
||||||
const QString &basePath,
|
const QString &basePath,
|
||||||
const PeersMap &peers,
|
const PeersMap &peers,
|
||||||
const QString &internalLinksDomain) {
|
const QString &internalLinksDomain,
|
||||||
|
Fn<QByteArray(int messageId, QByteArray text)> wrapMessageLink) {
|
||||||
const auto data = prepareMediaData(
|
const auto data = prepareMediaData(
|
||||||
message,
|
message,
|
||||||
basePath,
|
basePath,
|
||||||
|
@ -1587,6 +1599,8 @@ QByteArray HtmlWriter::Wrap::pushMedia(
|
||||||
return pushPoll(*poll);
|
return pushPoll(*poll);
|
||||||
} else if (const auto giveaway = std::get_if<GiveawayStart>(&content)) {
|
} else if (const auto giveaway = std::get_if<GiveawayStart>(&content)) {
|
||||||
return pushGiveaway(peers, *giveaway);
|
return pushGiveaway(peers, *giveaway);
|
||||||
|
} else if (const auto giveaway = std::get_if<GiveawayResults>(&content)) {
|
||||||
|
return pushGiveaway(peers, *giveaway, wrapMessageLink);
|
||||||
}
|
}
|
||||||
Assert(v::is_null(content));
|
Assert(v::is_null(content));
|
||||||
return QByteArray();
|
return QByteArray();
|
||||||
|
@ -2054,6 +2068,84 @@ QByteArray HtmlWriter::Wrap::pushGiveaway(
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QByteArray HtmlWriter::Wrap::pushGiveaway(
|
||||||
|
const PeersMap &peers,
|
||||||
|
const Data::GiveawayResults &data,
|
||||||
|
Fn<QByteArray(int messageId, QByteArray text)> wrapMessageLink) {
|
||||||
|
auto result = pushDiv("media_wrap clearfix");
|
||||||
|
result.append(pushDiv("media_giveaway"));
|
||||||
|
|
||||||
|
result.append(pushDiv("section_title bold"));
|
||||||
|
result.append((data.winnersCount > 1)
|
||||||
|
? SerializeString("Winners Selected!")
|
||||||
|
: SerializeString("Winner Selected!"));
|
||||||
|
result.append(popTag());
|
||||||
|
|
||||||
|
result.append(pushDiv("section_body"));
|
||||||
|
result.append(
|
||||||
|
"<b>" + Data::NumberToString(data.winnersCount) + "</b> "
|
||||||
|
+ SerializeString((data.winnersCount > 1) ? "winners" : "winner")
|
||||||
|
+ " of the "
|
||||||
|
+ wrapMessageLink(data.launchId, "Giveaway")
|
||||||
|
+ " was randomly selected by Telegram.");
|
||||||
|
result.append(popTag());
|
||||||
|
|
||||||
|
result.append(pushDiv("section_title bold"));
|
||||||
|
result.append((data.winnersCount > 1)
|
||||||
|
? SerializeString("Winners")
|
||||||
|
: SerializeString("Winner"));
|
||||||
|
result.append(popTag());
|
||||||
|
|
||||||
|
result.append(pushDiv("section_body"));
|
||||||
|
auto winners = QByteArrayList();
|
||||||
|
for (const auto &winner : data.winners) {
|
||||||
|
winners.append("<b>" + peers.wrapPeerName(winner) + "</b>");
|
||||||
|
}
|
||||||
|
const auto andMore = [&, size = data.winners.size()] {
|
||||||
|
if (data.winnersCount > size) {
|
||||||
|
return SerializeString(" and ")
|
||||||
|
+ Data::NumberToString(data.winnersCount - size)
|
||||||
|
+ SerializeString(" more!");
|
||||||
|
}
|
||||||
|
return QByteArray();
|
||||||
|
}();
|
||||||
|
result.append(winners.join(", ") + andMore);
|
||||||
|
result.append(popTag());
|
||||||
|
|
||||||
|
result.append(pushDiv("section_body"));
|
||||||
|
const auto prize = [&, singleStar = (data.credits == 1)] {
|
||||||
|
if (data.credits && data.winnersCount == 1) {
|
||||||
|
return SerializeString("The winner received ")
|
||||||
|
+ "<b>"
|
||||||
|
+ Data::NumberToString(data.credits)
|
||||||
|
+ "</b>"
|
||||||
|
+ SerializeString(singleStar ? " Star." : " Stars.");
|
||||||
|
} else if (data.credits && data.winnersCount > 1) {
|
||||||
|
return SerializeString("All winners received ")
|
||||||
|
+ "<b>"
|
||||||
|
+ Data::NumberToString(data.credits)
|
||||||
|
+ "</b>"
|
||||||
|
+ SerializeString(singleStar
|
||||||
|
? " Star in total."
|
||||||
|
: " Stars in total.");
|
||||||
|
} else if (data.unclaimedCount) {
|
||||||
|
return SerializeString("Some winners couldn't be selected.");
|
||||||
|
} else if (data.winnersCount == 1) {
|
||||||
|
return SerializeString(
|
||||||
|
"The winner received their gift link in a private message.");
|
||||||
|
} else if (data.winnersCount > 1) {
|
||||||
|
return SerializeString(
|
||||||
|
"All winners received gift links in private messages.");
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
result.append(prize);
|
||||||
|
result.append(popTag());
|
||||||
|
|
||||||
|
result.append(popTag());
|
||||||
|
result.append(popTag());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
MediaData HtmlWriter::Wrap::prepareMediaData(
|
MediaData HtmlWriter::Wrap::prepareMediaData(
|
||||||
const Data::Message &message,
|
const Data::Message &message,
|
||||||
const QString &basePath,
|
const QString &basePath,
|
||||||
|
@ -2213,6 +2305,7 @@ MediaData HtmlWriter::Wrap::prepareMediaData(
|
||||||
result.status = Data::FormatMoneyAmount(data.amount, data.currency);
|
result.status = Data::FormatMoneyAmount(data.amount, data.currency);
|
||||||
}, [](const Poll &data) {
|
}, [](const Poll &data) {
|
||||||
}, [](const GiveawayStart &data) {
|
}, [](const GiveawayStart &data) {
|
||||||
|
}, [](const GiveawayResults &data) {
|
||||||
}, [&](const PaidMedia &data) {
|
}, [&](const PaidMedia &data) {
|
||||||
result.classes = "media_invoice";
|
result.classes = "media_invoice";
|
||||||
result.status = Data::FormatMoneyAmount(data.stars, "XTR");
|
result.status = Data::FormatMoneyAmount(data.stars, "XTR");
|
||||||
|
|
|
@ -799,6 +799,7 @@ QByteArray SerializeMessage(
|
||||||
{ "until_date", SerializeDate(data.untilDate) },
|
{ "until_date", SerializeDate(data.untilDate) },
|
||||||
{ "channels", serialized },
|
{ "channels", serialized },
|
||||||
}));
|
}));
|
||||||
|
}, [&](const GiveawayResults &data) {
|
||||||
}, [&](const PaidMedia &data) {
|
}, [&](const PaidMedia &data) {
|
||||||
push("paid_stars_amount", data.stars);
|
push("paid_stars_amount", data.stars);
|
||||||
}, [](const UnsupportedMedia &data) {
|
}, [](const UnsupportedMedia &data) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue