summaryrefslogtreecommitdiff
path: root/src/commands.cpp
blob: 41660410d93fe8922a4a6148311a417a188a1c3c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "commands.hpp"
#include "commandHandler.hpp"
#include "sessionManager.hpp"

struct SKickArgs {
	std::string target;
	std::string reason;
};

struct SMuteArgs {
	std::string target;
	std::string reason;
};

void registerCommands() {
	g_pCommandHandler->registerCommand({.name = "raw", .parser = [](const std::string &args) -> CCommandHandler::SParseResult { return {.data = args, .good = true}; }, .exe = [](const std::any &parsed) -> CCommandHandler::SResult {
        const std::string &data = std::any_cast<const std::string &>(parsed);
        g_pSessionManager->broadcast(data);
        return {.result = "Broadcasted: " + data, .good = true}; }});

	g_pCommandHandler->registerCommand(CCommandHandler::makeCommand<SKickArgs>({.name = "kick", .parser = [](const std::string &args) -> std::pair<SKickArgs, bool> {
        size_t pos = args.find(' ');
        std::string target = args;
        std::string reason = "Kicked: No reason specified";

        if (pos != std::string::npos) {
            target = args.substr(0, pos);
            reason = args.substr(pos + 1);
            if (reason.empty())
                reason = "Kicked: No reason specified";
        }

        if (target.empty())
            return {SKickArgs{}, false};

        return {
            SKickArgs{.target=target, .reason=reason}, true}; }, .exe = [](const SKickArgs &data) -> CCommandHandler::SResult {
        const auto session = g_pSessionManager->getByName(data.target);
        if (!session)
            return {.result = "User '" + data.target + "' not found", .good = false};

        g_pSessionManager->kick(session, true, data.reason);
        return {.result = "Kicked '" + data.target + "': " + data.reason, .good = true}; }}));

	g_pCommandHandler->registerCommand({.name = "list", .parser = [](const std::string &args) -> CCommandHandler::SParseResult {
        (void)args;
        return {.data = std::any(), .good = true}; }, .exe = [](const std::any &parsed) -> CCommandHandler::SResult {
        (void)parsed;
        std::string result = "Clients:\n";
        for (const auto &session : g_pSessionManager->getSessions())
            result += session->getName() + "\t" + session->getIp() + "\t" + (session->isMuted() ? "[MUTED]" : "[UNMUTED]") + "\n";

        return {.result = result, .good = true}; }});

	g_pCommandHandler->registerCommand(CCommandHandler::makeCommand<SMuteArgs>({.name = "mute", .parser = [](const std::string &args) -> std::pair<SMuteArgs, bool> {
        size_t pos = args.find(' ');
        std::string target = args;
        std::string reason = "Muted: No reason specified";

        if (pos != std::string::npos) {
            target = args.substr(0, pos);
            reason = args.substr(pos + 1);
            if (reason.empty())
                reason = "Muted: No reason specified";
        }

        if (target.empty())
            return {SMuteArgs{}, false};

        return {SMuteArgs{.target=target, .reason=reason}, true}; }, .exe = [](const SMuteArgs &data) -> CCommandHandler::SResult {
        const auto session = g_pSessionManager->getByName(data.target);
        if (!session)
            return {.result = "User '" + data.target + "' not found", .good = false};

        session->setMuted(true);
        session->write("You have been muted");
        return {.result = "Muted '" + data.target + "': " + data.reason, .good = true}; }}));

	g_pCommandHandler->registerCommand(CCommandHandler::makeCommand<SMuteArgs>({.name = "unmute", .parser = [](const std::string &args) -> std::pair<SMuteArgs, bool> {
        if (args.empty())
            return {SMuteArgs{}, false};

        return {SMuteArgs{.target=args, .reason="Unmuted"}, true}; }, .exe = [](const SMuteArgs &data) -> CCommandHandler::SResult {
        const auto session = g_pSessionManager->getByName(data.target);
        if (!session)
            return {.result = "User '" + data.target + "' not found", .good = false};

        session->setMuted(false);
        session->write("You have been unmuted");
        return {.result = "Unmuted '" + data.target + "'", .good = true}; }}));
}