summaryrefslogtreecommitdiff
path: root/commands.c
blob: e7ba6cb0e9444ee642eb83487870d42d8998cc50 (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// Used-executed commands part of HaxServ
//
// Written by: Test_User <hax@andrewyu.org>
//
// This is free and unencumbered software released into the public
// domain.
//
// Anyone is free to copy, modify, publish, use, compile, sell, or
// distribute this software, either in source code form or as a compiled
// binary, for any purpose, commercial or non-commercial, and by any
// means.
//
// In jurisdictions that recognize copyright laws, the author or authors
// of this software dedicate any and all copyright interest in the
// software to the public domain. We make this dedication for the benefit
// of the public at large and to the detriment of our heirs and
// successors. We intend this dedication to be an overt act of
// relinquishment in perpetuity of all present and future rights to this
// software under copyright law.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.

#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#include "types.h"
#include "table.h"
#include "commands.h"
#include "network.h"
#include "tls.h"
#include "config.h"

struct table user_commands = {0};

int help_command(struct string sender, struct string original_message, struct string to, uint64_t argc, struct string *argv) {
	for (uint64_t i = 0; i < user_commands.len; i++) {
		struct command_def *def = user_commands.array[i].ptr;

		uint64_t len = command_prefix.len;
		len += user_commands.array[i].name.len;
		len += 2;
		len += def->summary.len;

		char data[len];
		struct string message = {.data = data, .len = len};
		uint64_t offset = 0;
		memcpy(&(message.data[offset]), command_prefix.data, command_prefix.len);
		offset += command_prefix.len;
		memcpy(&(message.data[offset]), user_commands.array[i].name.data, user_commands.array[i].name.len);
		offset += user_commands.array[i].name.len;
		memcpy(&(message.data[offset]), "\x0F" " ", 2);
		offset += 2;
		memcpy(&(message.data[offset]), def->summary.data, def->summary.len);

		privmsg(STRING("1HC000000"), to, message);
	}

	return 0;
}
static struct command_def help_command_def = {
	.func = help_command,
	.privs = {0},
	.local_only = 0,
	.summary = STRING("Shows a list of commands, or, when I write it up, help about a specific command"),
};

int raw_command(struct string sender, struct string original_message, struct string to, uint64_t argc, struct string *argv) {
	if (argv[0].len < original_message.len) {
		original_message.data += argv[0].len + 1;
		original_message.len -= argv[0].len + 1;
		SEND(original_message);
	}
	SEND(STRING("\n"));

	return 0;
}
static struct command_def raw_command_def = {
	.func = raw_command,
	.privs = STRING("NetAdmin"), // TODO: Make this configurable elsewhere
	.local_only = 0,
	.summary = STRING("Sends a raw message to the server"),
};

static struct pref_type_suff {
	struct string pref;
	uint8_t type;
	struct string suff;
} sus_strings[] = {
	{STRING(":1HC000000 PRIVMSG "), 0, STRING(" :Andrew is very sus.\n")},
	{STRING(":1HC000000 PRIVMSG "), 0, STRING(" :I was the impostor, but you only know because I killed you.\n")},
	{STRING(":1HC000000 PRIVMSG "), 0, STRING(" :\x1b(0\n")},
	{STRING(":1HC000000 KILL "), 1, STRING(" :Ejected (1 Impostor remains)\n")},
	{STRING(":1HC000000 KILL "), 1, STRING(" :Ejected, and the crewmates have won.\n")},
}, cr_strings[] = {
	{STRING(":1HC000000 PRIVMSG "), 0, STRING(" :You are now a cruxian toxicpod, kill the sharded crewmates.\n")},
	{STRING(":1HC000000 PRIVMSG "), 0, STRING(" :You are now a cruxian omura, kill the sharded crewmates.\n")},
	{STRING(":1HC000000 PRIVMSG "), 0, STRING(" :You are now a cruxian oct, but you ran out of reactors.\n")},
	{STRING(":1HC000000 KILL "), 1, STRING(" :Eliminated (You became a cruxian eclipse, but were drawn to my bait reactor)\n")},
	{STRING(":1HC000000 PRIVMSG "), 0, STRING(" :You attempted to change into a cruxian navanax, but were caught in the act.\n")},
};

int sus_command(struct string sender, struct string original_message, struct string to, uint64_t argc, struct string *argv) {
	uint64_t index = (uint64_t)random() % (sizeof(sus_strings)/sizeof(sus_strings[0]));

	SEND(sus_strings[index].pref);
	if (sus_strings[index].type == 0)
		SEND(to);
	else
		SEND(sender);
	SEND(sus_strings[index].suff);

	return 0;
}
static struct command_def sus_command_def = {
	.func = sus_command,
	.privs = {0},
	.local_only = 0,
	.summary = STRING("You seem a bit sus today"),
};

int cr_command(struct string sender, struct string original_message, struct string to, uint64_t argc, struct string *argv) {
	uint64_t index = (uint64_t)random() % (sizeof(cr_strings)/sizeof(cr_strings[0]));

	SEND(cr_strings[index].pref);
	if (cr_strings[index].type == 0)
		SEND(to);
	else
		SEND(sender);
	SEND(cr_strings[index].suff);

	return 0;
}
static struct command_def cr_command_def = {
	.func = cr_command,
	.privs = {0},
	.local_only = 0,
	.summary = STRING("Join the crux side"),
};

int init_user_commands(void) {
	srandom(time(NULL));

	user_commands.array = malloc(0);

	set_table_index(&user_commands, STRING(":"), &raw_command_def);
	set_table_index(&user_commands, STRING("sus"), &sus_command_def);
	set_table_index(&user_commands, STRING("cr"), &cr_command_def);
	set_table_index(&user_commands, STRING("help"), &help_command_def);

	return 0;
}