-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
178 lines (150 loc) · 6.4 KB
/
Program.cs
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
using Discord;
using Discord.WebSocket;
namespace Spellcard;
public static class Program
{
public static void Main(string[] args) => MainAsync().GetAwaiter().GetResult();
public static DiscordSocketClient Client = null!;
public static async Task MainAsync()
{
Client = new DiscordSocketClient(new DiscordSocketConfig());
Client.Log += Log;
Client.Ready += Initialize;
Client.MessageReceived += OnMessageRecieved;
Client.JoinedGuild += OnGuildJoined;
const string path = "token.txt";
string token;
if (File.Exists(path))
token = (await File.ReadAllTextAsync(path)).Replace(" ", "");
else
{
Console.WriteLine("No token has been found. Shutting down...");
return;
}
await Client.LoginAsync(TokenType.Bot, token);
await Client.StartAsync();
// Block this task until the program is closed.
await Task.Delay(-1);
}
private static Task Log(LogMessage msg)
{
Console.WriteLine(msg);
return Task.CompletedTask;
}
private static Task OnGuildJoined(SocketGuild guild)
{
CreateGuildCommandsFile(guild);
return Task.CompletedTask;
}
private static void CreateGuildCommandsFile(SocketGuild guild)
{
var mainPath = $"{guild.Id}";
var prefixPath = $"{mainPath}.prefix";
if (!File.Exists(mainPath))
File.WriteAllText(mainPath, "");
if (!File.Exists(prefixPath))
File.WriteAllText(prefixPath, "!");
}
private static Task OnMessageRecieved(SocketMessage message)
{
CreateGuildCommandsFile(message.Channel.GetGuild());
string prefix = File.ReadAllText($"{message.Channel.GetGuild().Id}.prefix");
if (message.Author.IsBot) return Task.CompletedTask;
if (message.Content.StartsWith($"{prefix}addcmd"))
{
var split = message.Content.Split(' ').Where((_, i) => i != 0).ToArray();
string input = split[0];
string output = string.Join(" ", split.Where((_, i) => i != 0));
message.Channel.SendMessageAsync(
AddCommandToFile(message.Channel.GetGuild(), input, output)
? $"Added command `{input}` with output: `{output.Replace("\\n", "\n")}`"
: $"Command `{input}` is already present.");
}
else if (message.Content.StartsWith($"{prefix}rmvcmd"))
{
var input = message.Content.Split(' ').Where((_, i) => i != 0).ToArray()[0];
var guild = message.Channel.GetGuild();
if (input is "addcmd" or "clrcmds" or "rmvcmd" or "%prefix")
message.Channel.SendMessageAsync("Cannot remove this command.");
else
message.Channel.SendMessageAsync(RemoveCommandToFile(guild, input)
? $"Removed command `{input}`."
: $"No command named `{input}` found.");
}
else if (message.Content.StartsWith($"{prefix}%prefix"))
{
var input = message.Content.Split(' ').Where((_, i) => i != 0).ToArray()[0];
var guild = message.Channel.GetGuild();
File.WriteAllText($"{guild.Id}.prefix", input);
message.Channel.SendMessageAsync($"Prefix is now set to `{input}`");
}
else if (message.Content == $"{prefix}clrcmds")
{
ClearCommands(message.Channel.GetGuild());
message.Channel.SendMessageAsync("Cleared all commands.");
}
else if (message.Content == $"{prefix}help")
{
message.Channel.SendMessageAsync(null, false, new EmbedBuilder()
.WithTitle("All commands")
.WithDescription(string.Join("\n", File.ReadAllLines($"{message.Channel.GetGuild().Id}")) + "\n" +
string.Join("\n", "clrcmds:Clears all user-set commands.",
"addcmd:Adds a new command. (`!addcmd example-cmd this is an example`)",
"rmvcmd:Removes a specified command. (`!rmvcmd example-cmd`)"))
.WithColor(Color.Blue)
.Build());
}
else
{
if (!message.Content.StartsWith(prefix) || message.Content.Length <= 1) return Task.CompletedTask;
var cmdName = message.Content.Remove(0, 1);
message.Channel.SendMessageAsync(GetCommandFromFile(message.Channel.GetGuild(), cmdName, out var output)
? output
: $"No command named `{cmdName}` found.");
}
return Task.CompletedTask;
}
private static bool AddCommandToFile(SocketGuild guild, string command, string output)
{
CreateGuildCommandsFile(guild);
var lines = File.ReadAllText($"{guild.Id}");
var lines2 = lines.Split('\n');
if (lines2.Any(x => x.Split(':')[0] is "addcmd" or "clrcmds" or "rmvcmd" or "%prefix" || x.Split(':')[0] == command)) return false;
File.WriteAllText($"{guild.Id}", lines + $"\n{command}:{output.Replace("\n", "\\n")}");
return true;
}
private static bool RemoveCommandToFile(SocketGuild guild, string command)
{
CreateGuildCommandsFile(guild);
var lines = File.ReadAllLines($"{guild.Id}");
var condition = new Func<string, bool>(x => x.Split(':')[0] != command);
if (lines.All(condition)) return false;
File.WriteAllLines($"{guild.Id}", lines.Where(condition));
return true;
}
private static bool GetCommandFromFile(SocketGuild guild, string command, out string response)
{
CreateGuildCommandsFile(guild);
var lines = File.ReadAllLines(guild.Id.ToString());
var condition = new Func<string, bool>(x => x.Split(':')[0] == command);
if (lines.Any(condition))
{
response = lines.Single(condition).Split(':')[1];
return true;
}
response = "null";
return false;
}
private static void ClearCommands(SocketGuild guild)
{
File.WriteAllText($"{guild.Id}", "");
}
private static Task Initialize()
{
foreach (var guild in Client.Guilds)
{
CreateGuildCommandsFile(guild);
}
return Task.CompletedTask;
}
}