mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-21 22:24:07 +01:00
Fix whisper receiving
Added setting to display them inline under "Special Channels" page Store a twitch users color in the TwitchUser struct this is useful if we ever want to use the users own color. The users own color is only updated once he has written once in chat Add helper method for calling function only on normal channels Fixes #54
This commit is contained in:
parent
f9a25171bf
commit
556dbe0456
8 changed files with 106 additions and 27 deletions
|
@ -138,5 +138,12 @@ void ChannelManager::doOnAll(std::function<void(ChannelPtr)> func)
|
|||
func(this->mentionsChannel);
|
||||
}
|
||||
|
||||
void ChannelManager::doOnAllNormalChannels(std::function<void(ChannelPtr)> func)
|
||||
{
|
||||
for (const auto &channel : this->twitchChannels) {
|
||||
func(std::get<0>(channel));
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace chatterino
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ public:
|
|||
const std::string &getUserID(const std::string &username);
|
||||
|
||||
void doOnAll(std::function<void(ChannelPtr)> func);
|
||||
void doOnAllNormalChannels(std::function<void(ChannelPtr)> func);
|
||||
|
||||
// Special channels
|
||||
const ChannelPtr whispersChannel;
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include "singletons/resourcemanager.hpp"
|
||||
#include "singletons/windowmanager.hpp"
|
||||
#include "twitch/twitchchannel.hpp"
|
||||
#include "twitch/twitchmessagebuilder.hpp"
|
||||
|
||||
using namespace chatterino::messages;
|
||||
|
||||
|
@ -139,7 +140,29 @@ void IrcMessageHandler::handleUserStateMessage(Communi::IrcMessage *message)
|
|||
|
||||
void IrcMessageHandler::handleWhisperMessage(Communi::IrcMessage *message)
|
||||
{
|
||||
// TODO: Implement
|
||||
debug::Log("Received whisper!");
|
||||
messages::MessageParseArgs args;
|
||||
|
||||
args.isReceivedWhisper = true;
|
||||
|
||||
auto c = this->channelManager.whispersChannel.get();
|
||||
|
||||
twitch::TwitchMessageBuilder builder(c, message, message->parameter(1), args);
|
||||
|
||||
if (!builder.isIgnored()) {
|
||||
messages::MessagePtr _message = builder.build();
|
||||
if (_message->flags & messages::Message::Highlighted) {
|
||||
singletons::ChannelManager::getInstance().mentionsChannel->addMessage(_message);
|
||||
}
|
||||
|
||||
c->addMessage(_message);
|
||||
|
||||
if (SettingManager::getInstance().inlineWhispers) {
|
||||
this->channelManager.doOnAllNormalChannels([_message](ChannelPtr channel) {
|
||||
channel->addMessage(_message); //
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void IrcMessageHandler::handleUserNoticeMessage(Communi::IrcMessage *message)
|
||||
|
@ -202,6 +225,7 @@ void IrcMessageHandler::handleWriteConnectionNoticeMessage(Communi::IrcNoticeMes
|
|||
|
||||
this->handleNoticeMessage(message);
|
||||
}
|
||||
|
||||
} // namespace helper
|
||||
} // namespace singletons
|
||||
} // namespace chatterino
|
||||
|
|
|
@ -27,6 +27,7 @@ public:
|
|||
void handleNoticeMessage(Communi::IrcNoticeMessage *message);
|
||||
void handleWriteConnectionNoticeMessage(Communi::IrcNoticeMessage *message);
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace helper
|
||||
} // namespace singletons
|
||||
} // namespace chatterino
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "twitchmessagebuilder.hpp"
|
||||
#include "debug/log.hpp"
|
||||
#include "singletons/accountmanager.hpp"
|
||||
#include "singletons/emotemanager.hpp"
|
||||
#include "singletons/ircmanager.hpp"
|
||||
#include "singletons/resourcemanager.hpp"
|
||||
|
@ -26,8 +27,22 @@ TwitchMessageBuilder::TwitchMessageBuilder(Channel *_channel,
|
|||
, args(_args)
|
||||
, tags(this->ircMessage->tags())
|
||||
, usernameColor(singletons::ThemeManager::getInstance().messages.textColors.system)
|
||||
, originalMessage(_ircMessage->content())
|
||||
, action(_ircMessage->isAction())
|
||||
{
|
||||
}
|
||||
|
||||
TwitchMessageBuilder::TwitchMessageBuilder(Channel *_channel,
|
||||
const Communi::IrcMessage *_ircMessage, QString content,
|
||||
const messages::MessageParseArgs &_args)
|
||||
: channel(_channel)
|
||||
, twitchChannel(dynamic_cast<TwitchChannel *>(_channel))
|
||||
, ircMessage(_ircMessage)
|
||||
, args(_args)
|
||||
, tags(this->ircMessage->tags())
|
||||
, usernameColor(singletons::ThemeManager::getInstance().messages.textColors.system)
|
||||
, originalMessage(content)
|
||||
{
|
||||
this->originalMessage = this->ircMessage->content();
|
||||
}
|
||||
|
||||
bool TwitchMessageBuilder::isIgnored() const
|
||||
|
@ -124,8 +139,8 @@ MessagePtr TwitchMessageBuilder::build()
|
|||
long int i = 0;
|
||||
|
||||
for (QString split : splits) {
|
||||
MessageColor textColor = ircMessage->isAction() ? MessageColor(this->usernameColor)
|
||||
: MessageColor(MessageColor::Text);
|
||||
MessageColor textColor =
|
||||
this->action ? MessageColor(this->usernameColor) : MessageColor(MessageColor::Text);
|
||||
|
||||
// twitch emote
|
||||
if (currentTwitchEmote != twitchEmotes.end() && currentTwitchEmote->first == i) {
|
||||
|
@ -243,7 +258,7 @@ void TwitchMessageBuilder::parseUsername()
|
|||
}
|
||||
|
||||
// username
|
||||
this->userName = ircMessage->nick();
|
||||
this->userName = this->ircMessage->nick();
|
||||
|
||||
if (this->userName.isEmpty()) {
|
||||
this->userName = this->tags.value(QLatin1String("login")).toString();
|
||||
|
@ -308,20 +323,36 @@ void TwitchMessageBuilder::appendUsername()
|
|||
if (this->args.isSentWhisper) {
|
||||
// TODO(pajlada): Re-implement
|
||||
// userDisplayString += IrcManager::getInstance().getUser().getUserName();
|
||||
} else if (this->args.isReceivedWhisper) {
|
||||
// Sender username
|
||||
this->emplace<TextElement>(usernameText, MessageElement::Text, this->usernameColor,
|
||||
FontStyle::MediumBold)
|
||||
->setLink({Link::UserInfo, this->userName});
|
||||
|
||||
auto currentUser = singletons::AccountManager::getInstance().Twitch.getCurrent();
|
||||
|
||||
// Separator
|
||||
this->emplace<TextElement>(
|
||||
"->", MessageElement::Text,
|
||||
singletons::ThemeManager::getInstance().messages.textColors.system, FontStyle::Medium);
|
||||
|
||||
QColor selfColor = currentUser->color;
|
||||
if (!selfColor.isValid()) {
|
||||
selfColor = singletons::ThemeManager::getInstance().messages.textColors.system;
|
||||
}
|
||||
|
||||
if (this->args.isReceivedWhisper) {
|
||||
// TODO(pajlada): Re-implement
|
||||
// userDisplayString += " -> " + IrcManager::getInstance().getUser().getUserName();
|
||||
}
|
||||
|
||||
if (!ircMessage->isAction()) {
|
||||
// Your own username
|
||||
this->emplace<TextElement>(currentUser->getUserName() + ":", MessageElement::Text,
|
||||
selfColor, FontStyle::MediumBold);
|
||||
} else {
|
||||
if (!this->action) {
|
||||
usernameText += ":";
|
||||
}
|
||||
|
||||
this->emplace<TextElement>(usernameText, MessageElement::Text, this->usernameColor,
|
||||
FontStyle::MediumBold)
|
||||
->setLink({Link::UserInfo, this->userName});
|
||||
}
|
||||
}
|
||||
|
||||
void TwitchMessageBuilder::parseHighlights()
|
||||
|
@ -329,11 +360,12 @@ void TwitchMessageBuilder::parseHighlights()
|
|||
static auto player = new QMediaPlayer;
|
||||
static QUrl currentPlayerUrl;
|
||||
singletons::SettingManager &settings = singletons::SettingManager::getInstance();
|
||||
static pajlada::Settings::Setting<std::string> currentUser("/accounts/current");
|
||||
auto currentUser = singletons::AccountManager::getInstance().Twitch.getCurrent();
|
||||
|
||||
QString currentUsername = QString::fromStdString(currentUser.getValue());
|
||||
QString currentUsername = currentUser->getUserName();
|
||||
|
||||
if (this->ircMessage->nick() == currentUsername) {
|
||||
currentUser->color = this->usernameColor;
|
||||
// Do nothing. Highlights cannot be triggered by yourself
|
||||
return;
|
||||
}
|
||||
|
@ -412,7 +444,7 @@ void TwitchMessageBuilder::parseHighlights()
|
|||
}
|
||||
}
|
||||
|
||||
void TwitchMessageBuilder::appendTwitchEmote(const Communi::IrcPrivateMessage *ircMessage,
|
||||
void TwitchMessageBuilder::appendTwitchEmote(const Communi::IrcMessage *ircMessage,
|
||||
const QString &emote,
|
||||
std::vector<std::pair<long int, util::EmoteData>> &vec)
|
||||
{
|
||||
|
@ -441,11 +473,11 @@ void TwitchMessageBuilder::appendTwitchEmote(const Communi::IrcPrivateMessage *i
|
|||
long int start = std::stol(coords.at(0).toStdString(), nullptr, 10);
|
||||
long int end = std::stol(coords.at(1).toStdString(), nullptr, 10);
|
||||
|
||||
if (start >= end || start < 0 || end > ircMessage->content().length()) {
|
||||
if (start >= end || start < 0 || end > this->originalMessage.length()) {
|
||||
return;
|
||||
}
|
||||
|
||||
QString name = ircMessage->content().mid(start, end - start + 1);
|
||||
QString name = this->originalMessage.mid(start, end - start + 1);
|
||||
|
||||
vec.push_back(
|
||||
std::pair<long int, util::EmoteData>(start, emoteManager.getTwitchEmoteById(id, name)));
|
||||
|
|
|
@ -28,10 +28,12 @@ public:
|
|||
|
||||
explicit TwitchMessageBuilder(Channel *_channel, const Communi::IrcPrivateMessage *_ircMessage,
|
||||
const messages::MessageParseArgs &_args);
|
||||
explicit TwitchMessageBuilder(Channel *_channel, const Communi::IrcMessage *_ircMessage,
|
||||
QString content, const messages::MessageParseArgs &_args);
|
||||
|
||||
Channel *channel;
|
||||
TwitchChannel *twitchChannel;
|
||||
const Communi::IrcPrivateMessage *ircMessage;
|
||||
const Communi::IrcMessage *ircMessage;
|
||||
messages::MessageParseArgs args;
|
||||
const QVariantMap tags;
|
||||
|
||||
|
@ -45,7 +47,9 @@ private:
|
|||
QString roomID;
|
||||
|
||||
QColor usernameColor;
|
||||
QString originalMessage;
|
||||
const QString originalMessage;
|
||||
|
||||
const bool action = false;
|
||||
|
||||
void parseMessageID();
|
||||
void parseRoomID();
|
||||
|
@ -54,7 +58,7 @@ private:
|
|||
void appendUsername();
|
||||
void parseHighlights();
|
||||
|
||||
void appendTwitchEmote(const Communi::IrcPrivateMessage *ircMessage, const QString &emote,
|
||||
void appendTwitchEmote(const Communi::IrcMessage *ircMessage, const QString &emote,
|
||||
std::vector<std::pair<long, util::EmoteData>> &vec);
|
||||
bool tryAppendEmote(QString &emoteString);
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include "ircaccount.hpp"
|
||||
|
||||
#include <QColor>
|
||||
#include <QString>
|
||||
|
||||
namespace chatterino {
|
||||
|
@ -27,6 +28,8 @@ public:
|
|||
|
||||
bool isAnon() const;
|
||||
|
||||
QColor color;
|
||||
|
||||
private:
|
||||
QString _oauthClient;
|
||||
QString _oauthToken;
|
||||
|
|
|
@ -13,6 +13,7 @@ namespace settingspages {
|
|||
SpecialChannelsPage::SpecialChannelsPage()
|
||||
: SettingsPage("Special channels", "")
|
||||
{
|
||||
singletons::SettingManager &settings = singletons::SettingManager::getInstance();
|
||||
util::LayoutCreator<SpecialChannelsPage> layoutCreator(this);
|
||||
auto layout = layoutCreator.setLayoutType<QVBoxLayout>();
|
||||
|
||||
|
@ -21,6 +22,12 @@ SpecialChannelsPage::SpecialChannelsPage()
|
|||
mentions.emplace<QLabel>("Join /mentions to view your mentions.");
|
||||
}
|
||||
|
||||
auto whispers = layout.emplace<QGroupBox>("Whispers").setLayoutType<QVBoxLayout>();
|
||||
{
|
||||
whispers.emplace<QLabel>("Join /whispers to view your mentions.");
|
||||
whispers.append(this->createCheckBox("Show whispers inline", settings.inlineWhispers));
|
||||
}
|
||||
|
||||
layout->addStretch(1);
|
||||
}
|
||||
} // namespace settingspages
|
||||
|
|
Loading…
Reference in a new issue