Merge pull request #1012 from apa420/apa-deleted-messages
Added support for single deleted messages
This commit is contained in:
@@ -264,6 +264,7 @@ void Application::initPubsub()
|
||||
auto msg = MessageBuilder(action).release();
|
||||
|
||||
postToThread([chan, msg] { chan->addMessage(msg); });
|
||||
chan->deleteMessage(msg->id);
|
||||
});
|
||||
|
||||
this->twitch.pubsub->start();
|
||||
|
||||
@@ -18,6 +18,7 @@ Resources2::Resources2()
|
||||
this->buttons.modModeEnabled = QPixmap(":/buttons/modModeEnabled.png");
|
||||
this->buttons.modModeEnabled2 = QPixmap(":/buttons/modModeEnabled2.png");
|
||||
this->buttons.timeout = QPixmap(":/buttons/timeout.png");
|
||||
this->buttons.trashCan = QPixmap(":/buttons/trashCan.png");
|
||||
this->buttons.unban = QPixmap(":/buttons/unban.png");
|
||||
this->buttons.unmod = QPixmap(":/buttons/unmod.png");
|
||||
this->buttons.update = QPixmap(":/buttons/update.png");
|
||||
|
||||
@@ -24,6 +24,7 @@ public:
|
||||
QPixmap modModeEnabled;
|
||||
QPixmap modModeEnabled2;
|
||||
QPixmap timeout;
|
||||
QPixmap trashCan;
|
||||
QPixmap unban;
|
||||
QPixmap unmod;
|
||||
QPixmap update;
|
||||
|
||||
@@ -212,6 +212,25 @@ void Channel::replaceMessage(MessagePtr message, MessagePtr replacement)
|
||||
}
|
||||
}
|
||||
|
||||
void Channel::deleteMessage(QString messageID)
|
||||
{
|
||||
LimitedQueueSnapshot<MessagePtr> snapshot = this->getMessageSnapshot();
|
||||
int snapshotLength = snapshot.size();
|
||||
|
||||
int end = std::max(0, snapshotLength - 200);
|
||||
|
||||
for (int i = snapshotLength - 1; i >= end; --i)
|
||||
{
|
||||
auto &s = snapshot[i];
|
||||
|
||||
if (s->id == messageID)
|
||||
{
|
||||
s->flags.set(MessageFlag::Disabled);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Channel::addRecentChatter(const MessagePtr &message)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ public:
|
||||
void addOrReplaceTimeout(MessagePtr message);
|
||||
void disableAllMessages();
|
||||
void replaceMessage(MessagePtr message, MessagePtr replacement);
|
||||
void deleteMessage(QString messageID);
|
||||
|
||||
QStringList modList;
|
||||
|
||||
|
||||
@@ -73,6 +73,10 @@ ModerationAction::ModerationAction(const QString &action)
|
||||
{
|
||||
this->image_ = Image::fromPixmap(getApp()->resources->buttons.ban);
|
||||
}
|
||||
else if (action.startsWith("/delete"))
|
||||
{
|
||||
this->image_ = Image::fromPixmap(getApp()->resources->buttons.trashCan);
|
||||
}
|
||||
else
|
||||
{
|
||||
QString xD = action;
|
||||
|
||||
@@ -266,6 +266,41 @@ void IrcMessageHandler::handleClearChatMessage(Communi::IrcMessage *message)
|
||||
}
|
||||
}
|
||||
|
||||
void IrcMessageHandler::handleClearMessageMessage(Communi::IrcMessage *message)
|
||||
{
|
||||
// check parameter count
|
||||
if (message->parameters().length() < 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QString chanName;
|
||||
if (!trimChannelName(message->parameter(0), chanName))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
auto app = getApp();
|
||||
|
||||
// get channel
|
||||
auto chan = app->twitch.server->getChannelOrEmpty(chanName);
|
||||
|
||||
if (chan->isEmpty())
|
||||
{
|
||||
log("[IrcMessageHandler:handleClearMessageMessage] Twitch channel {} "
|
||||
"not "
|
||||
"found",
|
||||
chanName);
|
||||
return;
|
||||
}
|
||||
|
||||
auto tags = message->tags();
|
||||
|
||||
QString targetID = tags.value("target-msg-id").toString();
|
||||
|
||||
chan->deleteMessage(targetID);
|
||||
}
|
||||
|
||||
void IrcMessageHandler::handleUserStateMessage(Communi::IrcMessage *message)
|
||||
{
|
||||
auto app = getApp();
|
||||
@@ -516,7 +551,17 @@ void IrcMessageHandler::handleNoticeMessage(Communi::IrcNoticeMessage *message)
|
||||
return;
|
||||
}
|
||||
|
||||
channel->addMessage(msg);
|
||||
QString tags = message->tags().value("msg-id", "").toString();
|
||||
if (tags == "bad_delete_message_error" || tags == "usage_delete")
|
||||
{
|
||||
channel->addMessage(makeSystemMessage(
|
||||
"Usage: \"/delete <msg-id>\" - can't take more "
|
||||
"than one argument"));
|
||||
}
|
||||
else
|
||||
{
|
||||
channel->addMessage(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ public:
|
||||
|
||||
void handleRoomStateMessage(Communi::IrcMessage *message);
|
||||
void handleClearChatMessage(Communi::IrcMessage *message);
|
||||
void handleClearMessageMessage(Communi::IrcMessage *message);
|
||||
void handleUserStateMessage(Communi::IrcMessage *message);
|
||||
void handleWhisperMessage(Communi::IrcMessage *message);
|
||||
|
||||
|
||||
@@ -580,7 +580,7 @@ void TwitchMessageBuilder::parseMessageID()
|
||||
|
||||
if (iterator != this->tags.end())
|
||||
{
|
||||
this->messageID = iterator.value().toString();
|
||||
this->message().id = iterator.value().toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -607,7 +607,7 @@ void TwitchMessageBuilder::parseRoomID()
|
||||
void TwitchMessageBuilder::appendChannelName()
|
||||
{
|
||||
QString channelName("#" + this->channel->getName());
|
||||
Link link(Link::Url, this->channel->getName() + "\n" + this->messageID);
|
||||
Link link(Link::Url, this->channel->getName() + "\n" + this->message().id);
|
||||
|
||||
this->emplace<TextElement>(channelName, MessageElementFlag::ChannelName,
|
||||
MessageColor::System) //
|
||||
|
||||
@@ -41,7 +41,6 @@ public:
|
||||
MessageParseArgs args;
|
||||
const QVariantMap tags;
|
||||
|
||||
QString messageID;
|
||||
QString userName;
|
||||
|
||||
bool isIgnored() const;
|
||||
@@ -55,8 +54,10 @@ private:
|
||||
void appendUsername();
|
||||
void parseHighlights(bool isPastMsg);
|
||||
|
||||
void appendTwitchEmote(const QString &emote,
|
||||
std::vector<std::tuple<int, EmotePtr, EmoteName>> &vec, std::vector<int> &correctPositions);
|
||||
void appendTwitchEmote(
|
||||
const QString &emote,
|
||||
std::vector<std::tuple<int, EmotePtr, EmoteName>> &vec,
|
||||
std::vector<int> &correctPositions);
|
||||
Outcome tryAppendEmote(const EmoteName &name);
|
||||
|
||||
void addWords(
|
||||
|
||||
@@ -156,6 +156,10 @@ void TwitchServer::messageReceived(Communi::IrcMessage *message)
|
||||
{
|
||||
handler.handleClearChatMessage(message);
|
||||
}
|
||||
else if (command == "CLEARMSG")
|
||||
{
|
||||
handler.handleClearMessageMessage(message);
|
||||
}
|
||||
else if (command == "USERSTATE")
|
||||
{
|
||||
handler.handleUserStateMessage(message);
|
||||
|
||||
@@ -1667,7 +1667,9 @@ void ChannelView::handleLinkClick(QMouseEvent *event, const Link &link,
|
||||
case Link::UserAction:
|
||||
{
|
||||
QString value = link.value;
|
||||
value.replace("{user}", layout->getMessage()->loginName).replace("{channel}", this->channel_->getName());
|
||||
value.replace("{user}", layout->getMessage()->loginName)
|
||||
.replace("{channel}", this->channel_->getName())
|
||||
.replace("{msg-id}", layout->getMessage()->id);
|
||||
this->channel_->sendMessage(value);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -161,7 +161,8 @@ ModerationPage::ModerationPage()
|
||||
// clang-format off
|
||||
auto label = modMode.emplace<QLabel>(
|
||||
"Moderation mode is enabled by clicking <img width='18' height='18' src=':/buttons/modModeDisabled.png'> in a channel that you moderate.<br><br>"
|
||||
"Moderation buttons can be bound to chat commands such as \"/ban {user}\", \"/timeout {user} 1000\", \"/w someusername !report {user} was bad in channel {channel}\" or any other custom text commands.<br>");
|
||||
"Moderation buttons can be bound to chat commands such as \"/ban {user}\", \"/timeout {user} 1000\", \"/w someusername !report {user} was bad in channel {channel}\" or any other custom text commands.<br>"
|
||||
"For deleting messages use /delete {msg-id}.");
|
||||
label->setWordWrap(true);
|
||||
label->setStyleSheet("color: #bbb");
|
||||
// clang-format on
|
||||
|
||||
Reference in New Issue
Block a user