From 06f30543730c372226c398c11b3de0213d711d13 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Wed, 8 Aug 2018 23:17:10 +0200 Subject: Add support for discord --- src/UsersSidePanel.cpp | 126 +++++++++++++++++++++---------------------------- 1 file changed, 55 insertions(+), 71 deletions(-) (limited to 'src/UsersSidePanel.cpp') diff --git a/src/UsersSidePanel.cpp b/src/UsersSidePanel.cpp index 687b976..b1f7843 100644 --- a/src/UsersSidePanel.cpp +++ b/src/UsersSidePanel.cpp @@ -11,6 +11,7 @@ #include #include #include +#include using namespace std; @@ -24,47 +25,50 @@ namespace dchat const float PADDING_BOTTOM = 20.0f; const i64 USER_TIMEOUT_SEC = 25; - static void renderUser(Cache &cache, User *user, sf::Shader *circleShader, sf::RenderWindow &window, sf::Vector2f &position, const sf::Font *font, const float textHeight, bool isUserOnline) + static void renderUser(Cache &cache, const User *user, sf::Shader *circleShader, sf::RenderWindow &window, sf::Vector2f &position, const sf::Font *font, const float textHeight, bool isUserOnline) { - // Max avatar size = 1mb - const ContentByUrlResult avatarResult = cache.getContentByUrl(user->avatarUrl, 1024 * 1024); - if(avatarResult.type == ContentByUrlResult::Type::CACHED) + if(position.y + AVATAR_DIAMETER > 0.0f && position.y < window.getSize().y) { - circleShader->setUniform("texture", sf::Shader::CurrentTexture); - - if(avatarResult.cachedType == ContentByUrlResult::CachedType::TEXTURE) + // Max avatar size = 1mb + const ContentByUrlResult avatarResult = cache.getContentByUrl(user->avatarUrl, 1024 * 1024); + if(avatarResult.type == ContentByUrlResult::Type::CACHED) { - // TODO: Store this sprite somewhere, might not be efficient to create a new sprite object every frame - sf::Sprite sprite(*avatarResult.texture); - auto textureSize = avatarResult.texture->getSize(); - sprite.setPosition(sf::Vector2f(floor(position.x), floor(position.y))); - sprite.setScale(sf::Vector2f(AVATAR_DIAMETER * Settings::getScaling() / (float)textureSize.x, AVATAR_DIAMETER * Settings::getScaling() / (float)textureSize.y)); - sprite.setColor(isUserOnline ? sf::Color::White : sf::Color(255, 255, 255, 100)); - window.draw(sprite, circleShader); + circleShader->setUniform("texture", sf::Shader::CurrentTexture); + + if(avatarResult.cachedType == ContentByUrlResult::CachedType::TEXTURE) + { + // TODO: Store this sprite somewhere, might not be efficient to create a new sprite object every frame + sf::Sprite sprite(*avatarResult.texture); + auto textureSize = avatarResult.texture->getSize(); + sprite.setPosition(sf::Vector2f(floor(position.x), floor(position.y))); + sprite.setScale(sf::Vector2f(AVATAR_DIAMETER * Settings::getScaling() / (float)textureSize.x, AVATAR_DIAMETER * Settings::getScaling() / (float)textureSize.y)); + sprite.setColor(isUserOnline ? sf::Color::White : sf::Color(255, 255, 255, 100)); + window.draw(sprite, circleShader); + } + else if(avatarResult.cachedType == ContentByUrlResult::CachedType::GIF) + { + auto gifSize = avatarResult.gif->getSize(); + avatarResult.gif->setPosition(sf::Vector2f(floor(position.x), floor(position.y))); + avatarResult.gif->setScale(sf::Vector2f(AVATAR_DIAMETER * Settings::getScaling() / (float)gifSize.x, AVATAR_DIAMETER * Settings::getScaling() / (float)gifSize.y)); + avatarResult.gif->setColor(isUserOnline ? sf::Color::White : sf::Color(255, 255, 255, 100)); + avatarResult.gif->draw(window, circleShader); + } } - else if(avatarResult.cachedType == ContentByUrlResult::CachedType::GIF) + else { - auto gifSize = avatarResult.gif->getSize(); - avatarResult.gif->setPosition(sf::Vector2f(floor(position.x), floor(position.y))); - avatarResult.gif->setScale(sf::Vector2f(AVATAR_DIAMETER * Settings::getScaling() / (float)gifSize.x, AVATAR_DIAMETER * Settings::getScaling() / (float)gifSize.y)); - avatarResult.gif->setColor(isUserOnline ? sf::Color::White : sf::Color(255, 255, 255, 100)); - avatarResult.gif->draw(window, circleShader); + sf::CircleShape avatarCircle(AVATAR_DIAMETER * 0.5f * Settings::getScaling(), 60 * Settings::getScaling()); + avatarCircle.setPosition(sf::Vector2f(floor(position.x), floor(position.y))); + avatarCircle.setFillColor(isUserOnline ? ColorScheme::getBackgroundColor() + sf::Color(30, 30, 30) : ColorScheme::getBackgroundColor() * sf::Color(255, 255, 255, 100)); + window.draw(avatarCircle); } + + // TODO: Remove this shit + sf::String str = sf::String::fromUtf8(user->getName().begin(), user->getName().end()); + sf::Text text(str, *font, FONT_SIZE * Settings::getScaling()); + text.setPosition(floor(position.x + (AVATAR_DIAMETER + AVATAR_PADDING_SIDE) * Settings::getScaling()), floor(position.y + AVATAR_DIAMETER * 0.5f - textHeight * 0.5f)); + text.setFillColor(isUserOnline ? sf::Color(15, 192, 252) : sf::Color(15, 192, 252, 100)); + window.draw(text); } - else - { - sf::CircleShape avatarCircle(AVATAR_DIAMETER * 0.5f * Settings::getScaling(), 60 * Settings::getScaling()); - avatarCircle.setPosition(sf::Vector2f(floor(position.x), floor(position.y))); - avatarCircle.setFillColor(isUserOnline ? ColorScheme::getBackgroundColor() + sf::Color(30, 30, 30) : ColorScheme::getBackgroundColor() * sf::Color(255, 255, 255, 100)); - window.draw(avatarCircle); - } - - // TODO: Remove this shit - sf::String str = sf::String::fromUtf8(user->getName().begin(), user->getName().end()); - sf::Text text(str, *font, FONT_SIZE * Settings::getScaling()); - text.setPosition(floor(position.x + (AVATAR_DIAMETER + AVATAR_PADDING_SIDE) * Settings::getScaling()), floor(position.y + AVATAR_DIAMETER * 0.5f - textHeight * 0.5f)); - text.setFillColor(isUserOnline ? sf::Color(15, 192, 252) : sf::Color(15, 192, 252, 100)); - window.draw(text); position.y += ((AVATAR_DIAMETER + PADDING_BOTTOM) * Settings::getScaling()); } @@ -86,24 +90,22 @@ namespace dchat const float textHeight = font->getLineSpacing(FONT_SIZE * Settings::getScaling()); i64 timestampSec = currentChannel->getSyncedTimestampUtcInSec(); + auto &channelUsers = currentChannel->getUsers(); + auto currentChannelUsers = sibs::makeFunction(channelUsers.data(), channelUsers.data() + channelUsers.size()); + for(BridgeService *bridgeService : currentChannel->getBridgeServices()) + { + auto &bridgeServiceUsers = bridgeService->getUsers(); + currentChannelUsers.merge(sibs::makeFunction(bridgeServiceUsers.data(), bridgeServiceUsers.data() + bridgeServiceUsers.size())); + } u32 numOnlineUsers = 0; u32 numOfflineUsers = 0; - for(User *user : currentChannel->getUsers()) + for(const User *user : currentChannelUsers) { - bool hasUserTimedOut = false; - if(user->isOnlineUser()) - { - auto onlineUser = static_cast(user); - i64 pingTimeDiffSec = timestampSec - (i64)onlineUser->pingTimestampSec; - if(pingTimeDiffSec > USER_TIMEOUT_SEC) - hasUserTimedOut = true; - } - - if(hasUserTimedOut) - ++numOfflineUsers; - else + if(user->isConnected(timestampSec)) ++numOnlineUsers; + else + ++numOfflineUsers; } // TODO: Remove this shit @@ -118,19 +120,10 @@ namespace dchat sf::Shader *circleShader = ResourceCache::getShader("shaders/circleMask.glsl", sf::Shader::Fragment); - for(User *user : currentChannel->getUsers()) + for(const User *user : currentChannelUsers) { - bool isUserOnline = true; - if(user->isOnlineUser()) - { - auto onlineUser = static_cast(user); - i64 pingTimeDiffSec = timestampSec - (i64)onlineUser->pingTimestampSec; - if(pingTimeDiffSec > USER_TIMEOUT_SEC) - isUserOnline = false; - } - - if(isUserOnline) - renderUser(cache, user, circleShader, window, position, font, textHeight, isUserOnline); + if(user->isConnected(timestampSec)) + renderUser(cache, user, circleShader, window, position, font, textHeight, true); } if(numOfflineUsers == 0) return; @@ -146,19 +139,10 @@ namespace dchat position.y += floor(font->getLineSpacing(text.getCharacterSize())); position.y += PADDING_BOTTOM * Settings::getScaling() * 0.5f; - for(User *user : currentChannel->getUsers()) + for(const User *user : currentChannelUsers) { - bool isUserOnline = true; - if(user->isOnlineUser()) - { - auto onlineUser = static_cast(user); - i64 pingTimeDiffSec = timestampSec - (i64)onlineUser->pingTimestampSec; - if(pingTimeDiffSec > USER_TIMEOUT_SEC) - isUserOnline = false; - } - - if(!isUserOnline) - renderUser(cache, user, circleShader, window, position, font, textHeight, isUserOnline); + if(!user->isConnected(timestampSec)) + renderUser(cache, user, circleShader, window, position, font, textHeight, false); } } -- cgit v1.2.3