-
Notifications
You must be signed in to change notification settings - Fork 1
/
Secret.cs
231 lines (209 loc) · 11.2 KB
/
Secret.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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
using System;
using System.Collections.Generic;
using System.IO;
using Serilog;
namespace AbevBot;
/// <summary> Secret configuration stuff. </summary>
public static class Secret
{
/// <summary> Secret keys that should be secret. </summary>
public enum Keys
{
/// <summary> Bot's name. Probably not relevant but should be set to the same as in App Manager in https://dev.twitch.tv/console/apps. </summary>
Name,
/// <summary> Bot's Customer ID. Read it from https://dev.twitch.tv/console/apps. </summary>
CustomerID,
/// <summary> Bot's Password. Read it from https://dev.twitch.tv/console/apps. </summary>
Password,
/// <summary> OAuth token to authenticate the bot. </summary>
OAuthToken,
/// <summary> OAuth refresh token to refresh OAuth token when it expiries. </summary>
OAuthRefreshToken,
/// <summary> TikTok Session ID needed for TikTok API calls. </summary>
TikTokSessionID,
/// <summary> Spotify app Client ID. </summary>
SpotifyClientID,
/// <summary> Spotify app Client Secret. </summary>
SpotifyClientSecret,
/// <summary> Spotify OAuth token to authenticate the bot. </summary>
SpotifyOAuthToken,
/// <summary> Spotify OAuth refresh token to refresh OAuth token when it expiries. </summary>
SpotifyOAuthRefreshToken,
/// <summary> Discord app Client ID. </summary>
DiscrodClientID,
/// <summary> Discord app Client Secret. </summary>
DiscordClientSecret,
/// <summary> Discord app Bot Token. </summary>
DiscordBotToken,
/// <summary> Discord channel ID on which messages shoud be posted. </summary>
DiscordChannelID,
/// <summary> Discord channel ID on which random videos are posted. </summary>
DiscordRandomVideosChannelID,
/// <summary> Discord OAuth token to authenticate the bot. </summary>
DiscordOAuthToken,
/// <summary> Discord OAuth refresh token to refresh OAuth token when it expiries. </summary>
DiscordOAuthRefreshToken
}
private const string FILENAME = "Secrets.ini";
private static Dictionary<Keys, string> _Data;
public static Dictionary<Keys, string> Data
{
get
{
if (_Data is null)
{
_Data = new();
foreach (var key in Enum.GetValues(typeof(Keys)))
{
_Data.Add((Keys)key, string.Empty);
}
}
return _Data;
}
}
public static bool ParseSecretFile()
{
Log.Information("Reading {file} file.", FILENAME);
// Create example Secrets.ini
FileInfo secretsFile = new("Secrets_example.ini");
CreateSecretsFile(secretsFile, true);
secretsFile = new(FILENAME);
if (secretsFile.Exists == false)
{
CreateSecretsFile(secretsFile);
return true;
}
else
{
using (StreamReader reader = new(secretsFile.FullName))
{
string line;
int lineIndex = 0;
while ((line = reader.ReadLine()) != null)
{
lineIndex++;
// Skip commented out lines
if (line.StartsWith("//") || line.StartsWith(';') || line.StartsWith('#') || string.IsNullOrWhiteSpace(line)) continue;
string[] text = line.Split(';')[0].Split('=', StringSplitOptions.TrimEntries);
if (text.Length < 2 || string.IsNullOrWhiteSpace(text[1]))
{
// Log.Warning("Bad {file} line: {index}.", FILENAME, lineIndex);
continue;
}
object key;
if (Enum.TryParse(typeof(Keys), text[0], out key))
{
switch ((Keys)key)
{
default:
if (Data.ContainsKey((Keys)key)) { Data[(Keys)key] = text[1].Trim(); }
else { Log.Warning("Not recognized key '{key}' on line {index} in {file} file.", text[0], lineIndex, FILENAME); }
break;
}
}
else { Log.Warning("Not recognized key '{key}' on line {index} in {file} file.", text[0], lineIndex, FILENAME); }
}
}
// Check if all needed data was read
if (Data[Keys.Name].Length == 0 || Data[Keys.CustomerID].Length == 0 || Data[Keys.Password].Length == 0)
{
Log.Error("Missing required information in {file} file.\r\nLook inside \"Required information in {file}\" section in README for help.\r\nYou can delete {file} file to generate new one. ! WARNING - ALL DATA INSIDE IT WILL BE LOST !", FILENAME, FILENAME, FILENAME);
return true;
}
}
return false;
}
private static void CreateSecretsFile(FileInfo file, bool example = false)
{
using (StreamWriter writer = new(file.FullName))
{
if (example)
{
writer.WriteLine();
writer.WriteLine("; CAUTION");
writer.WriteLine("; ----------------------------------------------------------------------");
writer.WriteLine("; ---------------------------------------------------------------------");
writer.WriteLine("; EXAMPLE SECRETS.INI FILE, WILL BE OVERRIDEN EVERY TIME THE BOT IS RUN");
writer.WriteLine("; ---------------------------------------------------------------------");
writer.WriteLine("; ----------------------------------------------------------------------");
writer.WriteLine();
writer.WriteLine();
}
writer.WriteLine("; The file contains top secret stuff.");
writer.WriteLine("; DO NOT SHOW THE FILE ON STREAM, or else...");
writer.WriteLine();
writer.WriteLine("; --------------------------------------------------");
writer.WriteLine("; Required things, that needs to be filled in.");
writer.WriteLine("; --------------------------------------------------");
writer.WriteLine();
writer.WriteLine("; ----- Twitch");
writer.WriteLine("; You need to register an app to get required information.");
writer.WriteLine("; Steps to register an app:");
writer.WriteLine("; 1. Log in to: https://dev.twitch.tv.");
writer.WriteLine("; 2. Go to dev console (via 'Your Console' button on top right or https://dev.twitch.tv/console).");
writer.WriteLine("; 3. Click 'Register your app' button on top right.");
writer.WriteLine("; 4. Fill up required information. As Redirect URL use 'http://localhost:3000'.");
writer.WriteLine("; 5. Next step will show secret information on your screen - don't show it on the stream.");
writer.WriteLine("; 6. Go back to list of appliactions (https://dev.twitch.tv/console/apps) and click 'Manage' button next to your newly created app.");
writer.WriteLine("; 7. Copy 'Name' and 'Customer ID' into the fields below. Also generate new 'Client secret' and copy that too.");
writer.WriteLine(string.Concat(Keys.Name.ToString(), " = "));
writer.WriteLine(string.Concat(Keys.CustomerID.ToString(), " = "));
writer.WriteLine(string.Concat(Keys.Password.ToString(), " = "));
writer.WriteLine();
writer.WriteLine();
writer.WriteLine("; --------------------------------------------------");
writer.WriteLine("; Additional things, can be left empty.");
writer.WriteLine("; --------------------------------------------------");
writer.WriteLine();
writer.WriteLine("; ----- TikTok");
writer.WriteLine("; Session ID needed for API calls. You have to search yourself how to get one. I can't help you.");
writer.WriteLine(string.Concat(Keys.TikTokSessionID.ToString(), " = "));
writer.WriteLine();
writer.WriteLine("; ----- Spotify");
writer.WriteLine("; The usage of Spotify is simillar to Twitch.");
writer.WriteLine("; You need Spotify account and you need to register a spotify app.");
writer.WriteLine("; Steps to register an app:");
writer.WriteLine("; 1. Log in to: https://developer.spotify.com.");
writer.WriteLine("; 2. Go to the dashboard (via button on top right or https://developer.spotify.com/dashboard).");
writer.WriteLine("; 3. Click 'Create app' button on top right.");
writer.WriteLine("; 4. Fill up required information. Website field can be left empty and as Redirect URI use 'http://localhost:3000'.");
writer.WriteLine("; 5. Next step will show secret information on your screen - don't show it on the stream.");
writer.WriteLine("; 6. Go to your app settings and copy 'Client ID' and 'Client secret' into the fields below.");
writer.WriteLine(string.Concat(Keys.SpotifyClientID.ToString(), " = "));
writer.WriteLine(string.Concat(Keys.SpotifyClientSecret.ToString(), " = "));
writer.WriteLine();
writer.WriteLine("; ----- Discord");
writer.WriteLine("; The Discord integration is used to post 'Stream went online' messages.");
writer.WriteLine("; Steps:");
writer.WriteLine("; 1. Log in to: https://discord.com/login.");
writer.WriteLine("; 2. Go to: https://discord.com/developers/applications?new_application=true and name the new Discord app.");
writer.WriteLine("; 3. Click the 'OAuth2' button on the left.");
writer.WriteLine("; 4. Copy 'Client ID' and 'Client Secret' into the fields below.");
writer.WriteLine("; 5. In the 'Redirects' section, add new URI 'http://localhost:3000/' and save the changes.");
writer.WriteLine("; 6. Click the 'Bot' button on the left.");
writer.WriteLine("; 7. You can change the bot 'User Name'. This name will be displayed in bot's messages.");
writer.WriteLine("; 8. Click 'Reset Token' or 'View Token' (whichever option is available), then copy new token into field below.");
writer.WriteLine("; 9. In the Discord application, right click on the channel you want the bot to post messages to and copy channel link.");
writer.WriteLine("; Channel ID is the last part of the link you copied (after the last '/') - put it in the field below.");
writer.WriteLine(string.Concat(Keys.DiscrodClientID.ToString(), " = "));
writer.WriteLine(string.Concat(Keys.DiscordClientSecret.ToString(), " = "));
writer.WriteLine(string.Concat(Keys.DiscordBotToken.ToString(), " = "));
writer.WriteLine(string.Concat(Keys.DiscordChannelID.ToString(), " = "));
writer.WriteLine("; Using discord channel as random video clips storage.");
writer.WriteLine("; The bot will use messages with attached videos in specified channel as source of clips for random videos.");
writer.WriteLine("; To enable this functionality:");
writer.WriteLine("; 10. Log in to: https://discord.com/login.");
writer.WriteLine("; 11. Go to: https://discord.com/developers/applications and click on a button with application (bot's User Name).");
writer.WriteLine("; 12. Click the 'Bot' button on the left.");
writer.WriteLine("; 13. Enable 'Message Content Intent'. This is required for the bot to read contents of messages in channels.");
writer.WriteLine("; 14. In the Discord application, right click on the channel on which video clips will be posted and copy channel link.");
writer.WriteLine("; Channel ID is the last part of the link you copied (after the last '/') - put it in the field below.");
writer.WriteLine(string.Concat(Keys.DiscordRandomVideosChannelID.ToString(), " = "));
}
if (!example)
{
// Notify the user
Log.Error("Missing required info in {file} file.\r\nThe file was generated.\r\nPlease fill it up and restart the bot.", FILENAME);
}
}
}