Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: allow timeout-related commands to be used in multiple channels #5402

Open
wants to merge 8 commits into
base: master
Choose a base branch
from

Conversation

pajlada
Copy link
Member

@pajlada pajlada commented May 18, 2024

This PR changes the behaviour of the following commands:

  • /ban
  • /timeout
  • /untimeout

All of those commands now accept one or more --channel parameters to override which channel the action should take place in.
The --channel parameter accepts a channel ID or channel name with the same syntax as the other "user targets" do (e.g. id:11148817 or pajlada)

examples
Ban user in the chat you're typing in:
/ban weeb123

Ban user in the chat you're typing in, with a reason specified:
/ban weeb123 the ban reason

Ban user in a separate chat, with a reason specified:
/ban --channel pajlada weeb123 the ban reason

Ban user in two separate chats, with a reason specified:
/ban --channel pajlada --channel id:117166826 weeb123 the ban reason

Timeout user in the chat you're typing in:
/timeout weeb123

Timeout user in the chat you're typing in, with a reason specified:
/timeout weeb123 10m the timeout reason

Timeout user in a separate chat, with a reason specified:
/timeout --channel pajlada weeb123 10m the timeout reason

Timeout user in two separate chats, with a reason specified:
/timeout --channel pajlada --channel id:117166826 weeb123 10m the timeout reason

Unban user in the chat you're typing in:
/unban weeb123

Unban user in a separate chat:
/unban --channel pajlada weeb123

Unban user in two separate chats:
/unban --channel pajlada --channel id:117166826 weeb123

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

clang-tidy made some suggestions

"from chatting. Reason is optional and will be shown to the target "
"user and other moderators. Use \"/unban\" to remove a ban.";
if (words.size() < 2)
std::vector<PerformChannelAction> actions;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: variable 'actions' is not initialized [cppcoreguidelines-init-variables]

Suggested change
std::vector<PerformChannelAction> actions;
std::vector<PerformChannelAction> actions = 0;

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

clang-tidy made some suggestions

@@ -1,6 +1,7 @@
#include "controllers/commands/builtin/twitch/Ban.hpp"

#include "Application.hpp"
#include "common/QLogging.hpp"
#include "controllers/accounts/AccountController.hpp"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: included header QLogging.hpp is not used directly [misc-include-cleaner]

Suggested change
#include "controllers/accounts/AccountController.hpp"
#include "controllers/accounts/AccountController.hpp"

const auto &words = ctx.words;
const auto &channel = ctx.channel;
const auto *twitchChannel = ctx.twitchChannel;
const auto command = QStringLiteral("/ban");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "QStringLiteral" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:14:

+ #include <qstringliteral.h>

}
else
{
qCWarning(chatterinoCommands)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "qCWarning" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:14:

+ #include <qloggingcategory.h>

return "";
}

assert(!actions.value().empty());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "assert" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:14:

+ #include <cassert>

@@ -1,5 +1,7 @@
#pragma once

#include "expected.hpp"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: 'expected.hpp' file not found [clang-diagnostic-error]

#include "expected.hpp"
         ^

class MockApplication : mock::EmptyApplication
{
public:
MockApplication()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: use '= default' to define a trivial default constructor [modernize-use-equals-default]

tests/src/Commands.cpp:18:

-     {
-     }
+     = default;


} // namespace

TEST(Commands, parseBanCommand)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "TEST" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:8:

+ #include <gtest/gtest.h>

{
MockApplication app;

std::shared_ptr<TwitchChannel> channel =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::shared_ptr" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:8:

+ #include <memory>

};
auto oActions = commands::parseChannelAction(ctx, "/ban", "usage", false);

ASSERT_TRUE(oActions.has_value()) << oActions.error();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "ASSERT_TRUE" is directly included [misc-include-cleaner]

    ASSERT_TRUE(oActions.has_value()) << oActions.error();
    ^


ASSERT_TRUE(oActions.has_value()) << oActions.error();
auto actions = *oActions;
ASSERT_EQ(actions.size(), 1);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "ASSERT_EQ" is directly included [misc-include-cleaner]

    ASSERT_EQ(actions.size(), 1);
    ^

@jupjohn
Copy link
Contributor

jupjohn commented May 21, 2024

In your example, you're using raw IDs but in other commands IDs have to be prefixed with id:. Could the same behaviour be used here to support both channel names & IDs? Keeps it consistent.

Also, are ---prefixed arguments used anywhere else? I don't have a better idea, but they feel very programmer-y which might feel weird to users.

@pajlada
Copy link
Member Author

pajlada commented May 21, 2024

-- prefixes are used in /openurl - I'm ok with them being a bit programmery since this use case is a bit programmery

I'm fine with --channel accepting the same type of input, e.g. 11148817 or pajlada

@pajlada pajlada changed the title feat: allow /ban to be used in multiple channels at once feat: allow timeout-related commands to be used in multiple channels May 21, 2024
Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

clang-tidy made some suggestions

const QString &sourceUserID, const QString &targetUserID,
const QString &reason, const QString &displayName)
{
getHelix()->banUser(
twitchChannel->roomId(), sourceUserID, targetUserID, std::nullopt,
reason,
channelID, sourceUserID, targetUserID, std::nullopt, reason,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::nullopt" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:14:

+ #include <optional>

@@ -119,189 +121,269 @@

namespace chatterino::commands {

QString sendBan(const CommandContext &ctx)
nonstd::expected<std::vector<PerformChannelAction>, QString> parseChannelAction(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "nonstd::expected_lite::expected" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:7:

- #include "providers/twitch/api/Helix.hpp"
+ #include "nonstd/expected.hpp"
+ #include "providers/twitch/api/Helix.hpp"

@@ -119,189 +121,269 @@

namespace chatterino::commands {

QString sendBan(const CommandContext &ctx)
nonstd::expected<std::vector<PerformChannelAction>, QString> parseChannelAction(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::vector" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:14:

+ #include <vector>

{
return "";
// A ban action must be performed with a channel as a context
return nonstd::make_unexpected(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "nonstd::expected_lite::make_unexpected" is directly included [misc-include-cleaner]

        return nonstd::make_unexpected(
                       ^

}

if (twitchChannel == nullptr)
QCommandLineParser parser;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "QCommandLineParser" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:14:

+ #include <qcommandlineparser.h>


} // namespace

TEST(Commands, parseBanCommand)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "TEST" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:8:

+ #include <gtest/gtest.h>

{
MockApplication app;

std::shared_ptr<TwitchChannel> channel =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::shared_ptr" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:8:

+ #include <memory>

MockApplication app;

std::shared_ptr<TwitchChannel> channel =
std::make_shared<TwitchChannel>("forsen");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::make_shared" is directly included [misc-include-cleaner]

        std::make_shared<TwitchChannel>("forsen");
             ^

};
auto oActions = commands::parseChannelAction(ctx, "/ban", "usage", false);

ASSERT_TRUE(oActions.has_value()) << oActions.error();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "ASSERT_TRUE" is directly included [misc-include-cleaner]

    ASSERT_TRUE(oActions.has_value()) << oActions.error();
    ^


ASSERT_TRUE(oActions.has_value()) << oActions.error();
auto actions = *oActions;
ASSERT_EQ(actions.size(), 1);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "ASSERT_EQ" is directly included [misc-include-cleaner]

    ASSERT_EQ(actions.size(), 1);
    ^

example:
`/ban --channel 11148817 --channel 117166826 forsen game complainer`

this would ban forsen with the reason `game complainer` in the two
listed channels
Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

clang-tidy made some suggestions

const QString &sourceUserID, const QString &targetUserID,
const QString &reason, const QString &displayName)
{
getHelix()->banUser(
twitchChannel->roomId(), sourceUserID, targetUserID, std::nullopt,
reason,
channelID, sourceUserID, targetUserID, std::nullopt, reason,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::nullopt" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:14:

+ #include <optional>

@@ -119,189 +121,269 @@

namespace chatterino::commands {

QString sendBan(const CommandContext &ctx)
nonstd::expected<std::vector<PerformChannelAction>, QString> parseChannelAction(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "nonstd::expected_lite::expected" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:7:

- #include "providers/twitch/api/Helix.hpp"
+ #include "nonstd/expected.hpp"
+ #include "providers/twitch/api/Helix.hpp"

@@ -119,189 +121,269 @@

namespace chatterino::commands {

QString sendBan(const CommandContext &ctx)
nonstd::expected<std::vector<PerformChannelAction>, QString> parseChannelAction(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::vector" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:14:

+ #include <vector>

{
return "";
// A ban action must be performed with a channel as a context
return nonstd::make_unexpected(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "nonstd::expected_lite::make_unexpected" is directly included [misc-include-cleaner]

        return nonstd::make_unexpected(
                       ^

}

if (twitchChannel == nullptr)
QCommandLineParser parser;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "QCommandLineParser" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:14:

+ #include <qcommandlineparser.h>


} // namespace

TEST(Commands, parseBanCommand)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "TEST" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:8:

+ #include <gtest/gtest.h>

{
MockApplication app;

std::shared_ptr<TwitchChannel> channel =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::shared_ptr" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:8:

+ #include <memory>

MockApplication app;

std::shared_ptr<TwitchChannel> channel =
std::make_shared<TwitchChannel>("forsen");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::make_shared" is directly included [misc-include-cleaner]

        std::make_shared<TwitchChannel>("forsen");
             ^

};
auto oActions = commands::parseChannelAction(ctx, "/ban", "usage", false);

ASSERT_TRUE(oActions.has_value()) << oActions.error();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "ASSERT_TRUE" is directly included [misc-include-cleaner]

    ASSERT_TRUE(oActions.has_value()) << oActions.error();
    ^


ASSERT_TRUE(oActions.has_value()) << oActions.error();
auto actions = *oActions;
ASSERT_EQ(actions.size(), 1);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "ASSERT_EQ" is directly included [misc-include-cleaner]

    ASSERT_EQ(actions.size(), 1);
    ^

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

clang-tidy made some suggestions

There were too many comments to post at once. Showing the first 25 out of 29. Check the log or trigger a new build to see more.

const QString &sourceUserID, const QString &targetUserID,
const QString &reason, const QString &displayName)
{
getHelix()->banUser(
twitchChannel->roomId(), sourceUserID, targetUserID, std::nullopt,
reason,
channelID, sourceUserID, targetUserID, std::nullopt, reason,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::nullopt" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:11:

+ #include <optional>

const auto &words = ctx.words;
const auto &channel = ctx.channel;
const auto *twitchChannel = ctx.twitchChannel;
const auto command = QStringLiteral("/ban");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "QStringLiteral" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:11:

+ #include <qstringliteral.h>

}
else
{
qCWarning(chatterinoCommands)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "qCWarning" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:11:

+ #include <qloggingcategory.h>

channel->addMessage(makeSystemMessage(usageStr));
return "";
}
assert(!actions.value().empty());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "assert" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:11:

+ #include <cassert>

});
const auto &reason = action.reason;

QStringList userLoginsToFetch;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "QStringList" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:11:

+ #include <qcontainerfwd.h>

}
};

std::ostream &operator<<(std::ostream &os, const IncompleteHelixUser &u);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::ostream" is directly included [misc-include-cleaner]

src/controllers/commands/common/ChannelAction.hpp:4:

+ #include <ostream>

{
}

ITwitchIrcServer *getTwitch() override
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "chatterino::ITwitchIrcServer" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:6:

- #include "singletons/Settings.hpp"
+ #include "providers/twitch/TwitchIrcServer.hpp"
+ #include "singletons/Settings.hpp"


} // namespace

TEST(Commands, parseBanActions)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "TEST" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:10:

+ #include <gtest/gtest.h>

{
MockApplication app;

std::shared_ptr<TwitchChannel> channel =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::shared_ptr" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:10:

+ #include <memory>

MockApplication app;

std::shared_ptr<TwitchChannel> channel =
std::make_shared<TwitchChannel>("forsen");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::make_shared" is directly included [misc-include-cleaner]

        std::make_shared<TwitchChannel>("forsen");
             ^

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

clang-tidy made some suggestions

There were too many comments to post at once. Showing the first 25 out of 29. Check the log or trigger a new build to see more.

const QString &sourceUserID, const QString &targetUserID,
const QString &reason, const QString &displayName)
{
getHelix()->banUser(
twitchChannel->roomId(), sourceUserID, targetUserID, std::nullopt,
reason,
channelID, sourceUserID, targetUserID, std::nullopt, reason,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::nullopt" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:11:

+ #include <optional>

const auto &words = ctx.words;
const auto &channel = ctx.channel;
const auto *twitchChannel = ctx.twitchChannel;
const auto command = QStringLiteral("/ban");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "QStringLiteral" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:11:

+ #include <qstringliteral.h>

}
else
{
qCWarning(chatterinoCommands)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "qCWarning" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:11:

+ #include <qloggingcategory.h>

channel->addMessage(makeSystemMessage(usageStr));
return "";
}
assert(!actions.value().empty());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "assert" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:11:

+ #include <cassert>

});
const auto &reason = action.reason;

QStringList userLoginsToFetch;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "QStringList" is directly included [misc-include-cleaner]

src/controllers/commands/builtin/twitch/Ban.cpp:11:

+ #include <qcontainerfwd.h>

}
};

std::ostream &operator<<(std::ostream &os, const IncompleteHelixUser &u);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::ostream" is directly included [misc-include-cleaner]

src/controllers/commands/common/ChannelAction.hpp:4:

+ #include <ostream>

{
}

ITwitchIrcServer *getTwitch() override
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "chatterino::ITwitchIrcServer" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:6:

- #include "singletons/Settings.hpp"
+ #include "providers/twitch/TwitchIrcServer.hpp"
+ #include "singletons/Settings.hpp"


} // namespace

TEST(Commands, parseBanActions)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "TEST" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:10:

+ #include <gtest/gtest.h>

{
MockApplication app;

std::shared_ptr<TwitchChannel> channel =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::shared_ptr" is directly included [misc-include-cleaner]

tests/src/Commands.cpp:10:

+ #include <memory>

MockApplication app;

std::shared_ptr<TwitchChannel> channel =
std::make_shared<TwitchChannel>("forsen");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "std::make_shared" is directly included [misc-include-cleaner]

        std::make_shared<TwitchChannel>("forsen");
             ^

@pajlada pajlada marked this pull request as ready for review June 2, 2024 14:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants