Added support of giveaway results messages to export to HTML.

This commit is contained in:
23rd 2024-08-29 11:40:45 +03:00 committed by John Preston
parent 064bab60ff
commit 00ad32c5f4
4 changed files with 138 additions and 4 deletions

View file

@ -753,6 +753,30 @@ GiveawayStart ParseGiveaway(const MTPDmessageMediaGiveaway &data) {
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(
const MTPVector<MTPPhoto> &data,
int baseIndex) {
@ -1257,7 +1281,7 @@ Media ParseMedia(
}, [&](const MTPDmessageMediaGiveaway &data) {
result.content = ParseGiveaway(data);
}, [&](const MTPDmessageMediaGiveawayResults &data) {
// #TODO export giveaway
result.content = ParseGiveaway(data);
}, [&](const MTPDmessageMediaPaidMedia &data) {
result.content = ParsePaidMedia(context, data, folder, date);
}, [](const MTPDmessageMediaEmpty &data) {});

View file

@ -220,6 +220,21 @@ struct GiveawayStart {
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 {
std::vector<Photo> list;
};
@ -353,6 +368,7 @@ struct Media {
Invoice,
Poll,
GiveawayStart,
GiveawayResults,
PaidMedia,
UnsupportedMedia> content;
TimeId ttl = 0;

View file

@ -598,7 +598,8 @@ private:
const Data::Message &message,
const QString &basePath,
const PeersMap &peers,
const QString &internalLinksDomain);
const QString &internalLinksDomain,
Fn<QByteArray(int messageId, QByteArray text)> wrapMessageLink);
[[nodiscard]] QByteArray pushGenericMedia(const MediaData &data);
[[nodiscard]] QByteArray pushStickerMedia(
const Data::Document &data,
@ -616,6 +617,10 @@ private:
[[nodiscard]] QByteArray pushGiveaway(
const PeersMap &peers,
const Data::GiveawayStart &data);
[[nodiscard]] QByteArray pushGiveaway(
const PeersMap &peers,
const Data::GiveawayResults &data,
Fn<QByteArray(int messageId, QByteArray text)> wrapMessageLink);
File _file;
QByteArray _composedStart;
@ -1456,7 +1461,13 @@ auto HtmlWriter::Wrap::pushMessage(
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);
if (!text.isEmpty()) {
@ -1559,7 +1570,8 @@ QByteArray HtmlWriter::Wrap::pushMedia(
const Data::Message &message,
const QString &basePath,
const PeersMap &peers,
const QString &internalLinksDomain) {
const QString &internalLinksDomain,
Fn<QByteArray(int messageId, QByteArray text)> wrapMessageLink) {
const auto data = prepareMediaData(
message,
basePath,
@ -1587,6 +1599,8 @@ QByteArray HtmlWriter::Wrap::pushMedia(
return pushPoll(*poll);
} else if (const auto giveaway = std::get_if<GiveawayStart>(&content)) {
return pushGiveaway(peers, *giveaway);
} else if (const auto giveaway = std::get_if<GiveawayResults>(&content)) {
return pushGiveaway(peers, *giveaway, wrapMessageLink);
}
Assert(v::is_null(content));
return QByteArray();
@ -2054,6 +2068,84 @@ QByteArray HtmlWriter::Wrap::pushGiveaway(
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(
const Data::Message &message,
const QString &basePath,
@ -2213,6 +2305,7 @@ MediaData HtmlWriter::Wrap::prepareMediaData(
result.status = Data::FormatMoneyAmount(data.amount, data.currency);
}, [](const Poll &data) {
}, [](const GiveawayStart &data) {
}, [](const GiveawayResults &data) {
}, [&](const PaidMedia &data) {
result.classes = "media_invoice";
result.status = Data::FormatMoneyAmount(data.stars, "XTR");

View file

@ -799,6 +799,7 @@ QByteArray SerializeMessage(
{ "until_date", SerializeDate(data.untilDate) },
{ "channels", serialized },
}));
}, [&](const GiveawayResults &data) {
}, [&](const PaidMedia &data) {
push("paid_stars_amount", data.stars);
}, [](const UnsupportedMedia &data) {