mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-13 19:49:51 +01:00
add eventsub over chat shitty code & proper submodule
This commit is contained in:
parent
9bf5cfe3b7
commit
2db096d59e
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -41,3 +41,6 @@
|
||||||
[submodule "tools/crash-handler"]
|
[submodule "tools/crash-handler"]
|
||||||
path = tools/crash-handler
|
path = tools/crash-handler
|
||||||
url = https://github.com/Chatterino/crash-handler
|
url = https://github.com/Chatterino/crash-handler
|
||||||
|
[submodule "lib/twitch-eventsub-ws"]
|
||||||
|
path = lib/twitch-eventsub-ws
|
||||||
|
url = https://github.com/Chatterino/twitch-eventsub-ws
|
||||||
|
|
|
@ -204,6 +204,8 @@ else()
|
||||||
add_subdirectory("${CMAKE_SOURCE_DIR}/lib/settings" EXCLUDE_FROM_ALL)
|
add_subdirectory("${CMAKE_SOURCE_DIR}/lib/settings" EXCLUDE_FROM_ALL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory("${CMAKE_SOURCE_DIR}/lib/twitch-eventsub-ws" EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
if (CHATTERINO_PLUGINS)
|
if (CHATTERINO_PLUGINS)
|
||||||
set(LUA_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/lib/lua/src")
|
set(LUA_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/lib/lua/src")
|
||||||
add_subdirectory(lib/lua)
|
add_subdirectory(lib/lua)
|
||||||
|
@ -213,8 +215,6 @@ if (BUILD_WITH_CRASHPAD)
|
||||||
add_subdirectory("${CMAKE_SOURCE_DIR}/tools/crash-handler")
|
add_subdirectory("${CMAKE_SOURCE_DIR}/tools/crash-handler")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_subdirectory("${CMAKE_SOURCE_DIR}/../beast-websocket-client" eventsub EXCLUDE_FROM_ALL)
|
|
||||||
|
|
||||||
# Used to provide a date of build in the About page (for nightly builds). Getting the actual time of
|
# Used to provide a date of build in the About page (for nightly builds). Getting the actual time of
|
||||||
# compilation in CMake is a more involved, as documented in https://stackoverflow.com/q/24292898.
|
# compilation in CMake is a more involved, as documented in https://stackoverflow.com/q/24292898.
|
||||||
# For CI runs, however, the date of build file generation should be consistent with the date of
|
# For CI runs, however, the date of build file generation should be consistent with the date of
|
||||||
|
|
1
lib/twitch-eventsub-ws
Submodule
1
lib/twitch-eventsub-ws
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 091301e15d2aa86b5218c1917e351026aaf1d544
|
|
@ -374,6 +374,8 @@ set(SOURCE_FILES
|
||||||
providers/twitch/ChannelPointReward.hpp
|
providers/twitch/ChannelPointReward.hpp
|
||||||
providers/twitch/EventSub.cpp
|
providers/twitch/EventSub.cpp
|
||||||
providers/twitch/EventSub.hpp
|
providers/twitch/EventSub.hpp
|
||||||
|
providers/twitch/EventSubMessageBuilder.cpp
|
||||||
|
providers/twitch/EventSubMessageBuilder.hpp
|
||||||
providers/twitch/IrcMessageHandler.cpp
|
providers/twitch/IrcMessageHandler.cpp
|
||||||
providers/twitch/IrcMessageHandler.hpp
|
providers/twitch/IrcMessageHandler.hpp
|
||||||
providers/twitch/PubSubActions.cpp
|
providers/twitch/PubSubActions.cpp
|
||||||
|
@ -766,11 +768,7 @@ target_link_libraries(${LIBRARY_PROJECT}
|
||||||
RapidJSON::RapidJSON
|
RapidJSON::RapidJSON
|
||||||
LRUCache
|
LRUCache
|
||||||
MagicEnum
|
MagicEnum
|
||||||
)
|
twitch-eventsub-ws
|
||||||
|
|
||||||
target_link_libraries(${LIBRARY_PROJECT}
|
|
||||||
PUBLIC
|
|
||||||
eventsub
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if (CHATTERINO_PLUGINS)
|
if (CHATTERINO_PLUGINS)
|
||||||
|
@ -824,7 +822,7 @@ if (BUILD_APP)
|
||||||
|
|
||||||
target_link_libraries(${EXECUTABLE_PROJECT}
|
target_link_libraries(${EXECUTABLE_PROJECT}
|
||||||
PUBLIC
|
PUBLIC
|
||||||
eventsub
|
twitch-eventsub-ws
|
||||||
)
|
)
|
||||||
|
|
||||||
set_target_directory_hierarchy(${EXECUTABLE_PROJECT})
|
set_target_directory_hierarchy(${EXECUTABLE_PROJECT})
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "messages/Message.hpp"
|
#include "messages/Message.hpp"
|
||||||
#include "messages/MessageBuilder.hpp"
|
#include "messages/MessageBuilder.hpp"
|
||||||
#include "providers/twitch/api/Helix.hpp"
|
#include "providers/twitch/api/Helix.hpp"
|
||||||
|
#include "providers/twitch/EventSubMessageBuilder.hpp"
|
||||||
#include "providers/twitch/PubSubActions.hpp"
|
#include "providers/twitch/PubSubActions.hpp"
|
||||||
#include "providers/twitch/TwitchAccount.hpp"
|
#include "providers/twitch/TwitchAccount.hpp"
|
||||||
#include "providers/twitch/TwitchChannel.hpp"
|
#include "providers/twitch/TwitchChannel.hpp"
|
||||||
|
@ -16,8 +17,8 @@
|
||||||
#include <boost/asio/io_context.hpp>
|
#include <boost/asio/io_context.hpp>
|
||||||
#include <boost/asio/ssl.hpp>
|
#include <boost/asio/ssl.hpp>
|
||||||
#include <boost/json.hpp>
|
#include <boost/json.hpp>
|
||||||
#include <eventsub/listener.hpp>
|
#include <twitch-eventsub-ws/listener.hpp>
|
||||||
#include <eventsub/session.hpp>
|
#include <twitch-eventsub-ws/session.hpp>
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
@ -103,6 +104,26 @@ public:
|
||||||
<< roomID << ":" << message;
|
<< roomID << ":" << message;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
QJsonObject condition;
|
||||||
|
condition.insert("broadcaster_user_id", roomID);
|
||||||
|
condition.insert("user_id", sourceUserID);
|
||||||
|
|
||||||
|
getHelix()->createEventSubSubscription(
|
||||||
|
"channel.chat.message", "v1", sessionID, condition,
|
||||||
|
[roomID](const auto &response) {
|
||||||
|
qDebug() << "Successfully subscribed to "
|
||||||
|
"channel.chat.message in "
|
||||||
|
<< roomID << ":" << response;
|
||||||
|
},
|
||||||
|
[roomID](auto error, const auto &message) {
|
||||||
|
(void)error;
|
||||||
|
qDebug() << "Failed subscription to "
|
||||||
|
"channel.chat.message in"
|
||||||
|
<< roomID << ":" << message;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -198,6 +219,27 @@ public:
|
||||||
qCDebug(LOG) << "On channel update for"
|
qCDebug(LOG) << "On channel update for"
|
||||||
<< payload.event.broadcasterUserLogin.c_str();
|
<< payload.event.broadcasterUserLogin.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void onChannelChatMessage(
|
||||||
|
eventsub::messages::Metadata metadata,
|
||||||
|
eventsub::payload::channel_chat_message::v1::Payload payload) override
|
||||||
|
{
|
||||||
|
(void)metadata;
|
||||||
|
|
||||||
|
std::cout << "Channel chat message event!\n";
|
||||||
|
|
||||||
|
runInGuiThread([payload{std::move(payload)}]() {
|
||||||
|
MessageParseArgs args;
|
||||||
|
EventSubMessageBuilder builder(payload, args);
|
||||||
|
|
||||||
|
auto message = builder.build();
|
||||||
|
|
||||||
|
auto channel = getApp()->twitch->getChannelOrEmptyByID(
|
||||||
|
QString::fromStdString(payload.event.broadcasterUserID));
|
||||||
|
|
||||||
|
channel->addMessage(message);
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void EventSub::start()
|
void EventSub::start()
|
||||||
|
|
1353
src/providers/twitch/EventSubMessageBuilder.cpp
Normal file
1353
src/providers/twitch/EventSubMessageBuilder.cpp
Normal file
File diff suppressed because it is too large
Load diff
107
src/providers/twitch/EventSubMessageBuilder.hpp
Normal file
107
src/providers/twitch/EventSubMessageBuilder.hpp
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common/Aliases.hpp"
|
||||||
|
#include "common/Outcome.hpp"
|
||||||
|
#include "messages/SharedMessageBuilder.hpp"
|
||||||
|
#include "providers/twitch/TwitchMessageBuilder.hpp" // TODO: REMOVE
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QVariant>
|
||||||
|
#include <twitch-eventsub-ws/payloads/channel-chat-message-v1.hpp>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
namespace chatterino {
|
||||||
|
|
||||||
|
struct Emote;
|
||||||
|
using EmotePtr = std::shared_ptr<const Emote>;
|
||||||
|
|
||||||
|
class Channel;
|
||||||
|
class TwitchChannel;
|
||||||
|
class MessageThread;
|
||||||
|
struct HelixVip;
|
||||||
|
using HelixModerator = HelixVip;
|
||||||
|
struct ChannelPointReward;
|
||||||
|
struct DeleteAction;
|
||||||
|
|
||||||
|
class EventSubMessageBuilder : MessageBuilder
|
||||||
|
{
|
||||||
|
const eventsub::payload::channel_chat_message::v1::Payload &payload;
|
||||||
|
const std::shared_ptr<Channel> channel;
|
||||||
|
const MessageParseArgs &args;
|
||||||
|
QString originalMessage;
|
||||||
|
const TwitchChannel *twitchChannel;
|
||||||
|
|
||||||
|
QColor usernameColor = {153, 153, 153};
|
||||||
|
|
||||||
|
public:
|
||||||
|
EventSubMessageBuilder() = delete;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NOTE: The builder MUST NOT survive longer than the payload
|
||||||
|
**/
|
||||||
|
explicit EventSubMessageBuilder(
|
||||||
|
const eventsub::payload::channel_chat_message::v1::Payload &_payload,
|
||||||
|
const MessageParseArgs &_args);
|
||||||
|
|
||||||
|
~EventSubMessageBuilder() override = default;
|
||||||
|
|
||||||
|
MessagePtr build();
|
||||||
|
|
||||||
|
void setThread(std::shared_ptr<MessageThread> thread);
|
||||||
|
void setParent(MessagePtr parent);
|
||||||
|
void setMessageOffset(int offset);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void parseUsernameColor();
|
||||||
|
// Parse & build thread information into the message
|
||||||
|
// Will read information from thread_ or from IRC tags
|
||||||
|
void parseThread();
|
||||||
|
|
||||||
|
void runIgnoreReplaces(std::vector<TwitchEmoteOccurrence> &twitchEmotes);
|
||||||
|
|
||||||
|
std::optional<EmotePtr> getTwitchBadge(const Badge &badge) const;
|
||||||
|
Outcome tryAppendEmote(const EmoteName &name);
|
||||||
|
|
||||||
|
void addWords();
|
||||||
|
void addTextOrEmoji(EmotePtr emote) override;
|
||||||
|
void addTextOrEmoji(const QString &value) override;
|
||||||
|
|
||||||
|
void appendTwitchBadges();
|
||||||
|
void appendChatterinoBadges();
|
||||||
|
void appendFfzBadges();
|
||||||
|
void appendSeventvBadges();
|
||||||
|
Outcome tryParseCheermote(const QString &string);
|
||||||
|
|
||||||
|
bool shouldAddModerationElements() const;
|
||||||
|
|
||||||
|
QString roomID_;
|
||||||
|
bool hasBits_ = false;
|
||||||
|
QString bits;
|
||||||
|
int bitsLeft{};
|
||||||
|
bool bitsStacked = false;
|
||||||
|
std::shared_ptr<MessageThread> thread_;
|
||||||
|
MessagePtr parent_;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starting offset to be used on index-based operations on `originalMessage_`.
|
||||||
|
*
|
||||||
|
* For example:
|
||||||
|
* originalMessage_ = "there"
|
||||||
|
* messageOffset_ = 4
|
||||||
|
* (the irc message is "hey there")
|
||||||
|
*
|
||||||
|
* then the index 6 would resolve to 6 - 4 = 2 => 'e'
|
||||||
|
*/
|
||||||
|
int messageOffset_ = 0;
|
||||||
|
|
||||||
|
// User ID of the sender of this message
|
||||||
|
QString userId_;
|
||||||
|
QString userName; // TODO: Rename to userLogin
|
||||||
|
bool senderIsBroadcaster{};
|
||||||
|
|
||||||
|
const QVariantMap tags;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace chatterino
|
|
@ -451,6 +451,7 @@ private:
|
||||||
|
|
||||||
friend class TwitchIrcServer;
|
friend class TwitchIrcServer;
|
||||||
friend class TwitchMessageBuilder;
|
friend class TwitchMessageBuilder;
|
||||||
|
friend class EventSubMessageBuilder; // TODO: Remove this
|
||||||
friend class IrcMessageHandler;
|
friend class IrcMessageHandler;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue