fixed crash related to clojures in TwitchChannel

This commit is contained in:
fourtf 2018-01-05 00:58:25 +01:00
parent 23e5100227
commit 2b88250761
2 changed files with 33 additions and 13 deletions

View file

@ -19,7 +19,7 @@ namespace messages {
class Message; class Message;
} }
class Channel class Channel : public std::enable_shared_from_this<Channel>
{ {
public: public:
explicit Channel(const QString &_name); explicit Channel(const QString &_name);

View file

@ -104,7 +104,17 @@ void TwitchChannel::refreshLiveStatus()
QString url("https://api.twitch.tv/kraken/streams/" + this->roomID); QString url("https://api.twitch.tv/kraken/streams/" + this->roomID);
util::twitch::get2(url, QThread::currentThread(), [this](rapidjson::Document &d) { std::weak_ptr<Channel> weak = this->shared_from_this();
util::twitch::get2(url, QThread::currentThread(), [weak](rapidjson::Document &d) {
std::shared_ptr<Channel> shared = weak.lock();
if (!shared) {
return;
}
TwitchChannel *channel = dynamic_cast<TwitchChannel *>(shared.get());
if (!d.IsObject()) { if (!d.IsObject()) {
debug::Log("[TwitchChannel:refreshLiveStatus] root is not an object"); debug::Log("[TwitchChannel:refreshLiveStatus] root is not an object");
return; return;
@ -119,14 +129,14 @@ void TwitchChannel::refreshLiveStatus()
if (!stream.IsObject()) { if (!stream.IsObject()) {
// Stream is offline (stream is most likely null) // Stream is offline (stream is most likely null)
this->setLive(false); channel->setLive(false);
return; return;
} }
if (!stream.HasMember("viewers") || !stream.HasMember("game") || if (!stream.HasMember("viewers") || !stream.HasMember("game") ||
!stream.HasMember("channel") || !stream.HasMember("created_at")) { !stream.HasMember("channel") || !stream.HasMember("created_at")) {
debug::Log("[TwitchChannel:refreshLiveStatus] Missing members in stream"); debug::Log("[TwitchChannel:refreshLiveStatus] Missing members in stream");
this->setLive(false); channel->setLive(false);
return; return;
} }
@ -138,15 +148,15 @@ void TwitchChannel::refreshLiveStatus()
} }
// Stream is live // Stream is live
this->streamViewerCount = QString::number(stream["viewers"].GetInt()); channel->streamViewerCount = QString::number(stream["viewers"].GetInt());
this->streamGame = stream["game"].GetString(); channel->streamGame = stream["game"].GetString();
this->streamStatus = streamChannel["status"].GetString(); channel->streamStatus = streamChannel["status"].GetString();
QDateTime since = QDateTime::fromString(stream["created_at"].GetString(), Qt::ISODate); QDateTime since = QDateTime::fromString(stream["created_at"].GetString(), Qt::ISODate);
auto diff = since.secsTo(QDateTime::currentDateTime()); auto diff = since.secsTo(QDateTime::currentDateTime());
this->streamUptime = channel->streamUptime =
QString::number(diff / 3600) + "h " + QString::number(diff % 3600 / 60) + "m"; QString::number(diff / 3600) + "h " + QString::number(diff % 3600 / 60) + "m";
this->setLive(true); channel->setLive(true);
}); });
} }
@ -154,9 +164,19 @@ void TwitchChannel::fetchRecentMessages()
{ {
static QString genericURL = static QString genericURL =
"https://tmi.twitch.tv/api/rooms/%1/recent_messages?client_id=" + getDefaultClientID(); "https://tmi.twitch.tv/api/rooms/%1/recent_messages?client_id=" + getDefaultClientID();
std::weak_ptr<Channel> weak = this->shared_from_this();
util::twitch::get(genericURL.arg(roomID), QThread::currentThread(), [weak](QJsonObject obj) {
std::shared_ptr<Channel> shared = weak.lock();
if (!shared) {
return;
}
TwitchChannel *channel = dynamic_cast<TwitchChannel *>(shared.get());
static auto readConnection = singletons::IrcManager::getInstance().getReadConnection(); static auto readConnection = singletons::IrcManager::getInstance().getReadConnection();
util::twitch::get(genericURL.arg(roomID), QThread::currentThread(), [=](QJsonObject obj) {
auto msgArray = obj.value("messages").toArray(); auto msgArray = obj.value("messages").toArray();
if (msgArray.size() > 0) { if (msgArray.size() > 0) {
std::vector<messages::SharedMessage> messages; std::vector<messages::SharedMessage> messages;
@ -168,10 +188,10 @@ void TwitchChannel::fetchRecentMessages()
auto privMsg = static_cast<Communi::IrcPrivateMessage *>(msg); auto privMsg = static_cast<Communi::IrcPrivateMessage *>(msg);
messages::MessageParseArgs args; messages::MessageParseArgs args;
twitch::TwitchMessageBuilder builder(this, privMsg, args); twitch::TwitchMessageBuilder builder(channel, privMsg, args);
messages.at(i) = builder.parse(); messages.at(i) = builder.parse();
} }
this->addMessagesAtStart(messages); channel->addMessagesAtStart(messages);
} }
}); });
} }