Skip to content
This repository was archived by the owner on Sep 29, 2020. It is now read-only.

Commit 2ee5817

Browse files
authored
Prevent IRC nipping on Discord Failures (#20)
1 parent 3644e81 commit 2ee5817

File tree

5 files changed

+62
-19
lines changed

5 files changed

+62
-19
lines changed

Diff for: IRC-Relay/Discord.cs

+17-5
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,20 @@ public async Task OnDiscordDisconnect(Exception ex)
8585
{
8686
/* Create a new thread to kill the session. We cannot block
8787
* this Disconnect call */
88-
new System.Threading.Thread(() => { session.Kill(); }).Start();
88+
new System.Threading.Thread(async() => { await session.Kill(Session.TargetBot.Discord); }).Start();
8989

9090
await Log(new LogMessage(LogSeverity.Critical, "OnDiscordDisconnect", ex.Message));
9191
}
9292

93+
public void Kill()
94+
{
95+
try
96+
{
97+
this.Dispose();
98+
}
99+
catch { }
100+
}
101+
93102
public async Task OnDiscordMessage(SocketMessage messageParam)
94103
{
95104
if (!(messageParam is SocketUserMessage message)) return;
@@ -164,21 +173,24 @@ await messageParam.Author.SendMessageAsync("To prevent you from having to re-typ
164173

165174
foreach (var attachment in message.Attachments)
166175
{
167-
session.SendMessage(Session.MessageDestination.IRC, attachment.Url, username);
176+
session.SendMessage(Session.TargetBot.IRC, attachment.Url, username);
168177
}
169178

170179
foreach (String part in parts) // we're going to send each line indpependently instead of letting irc clients handle it.
171180
{
172181
if (part.Trim().Length != 0) // if the string is not empty or just spaces
173182
{
174-
session.SendMessage(Session.MessageDestination.IRC, part, username);
183+
session.SendMessage(Session.TargetBot.IRC, part, username);
175184
}
176185
}
177186
}
178187

179188
public static Task Log(LogMessage msg)
180189
{
181-
return Task.Run(() => Console.WriteLine(msg.ToString()));
190+
return Task.Run(() => {
191+
Console.ForegroundColor = ConsoleColor.White;
192+
Console.WriteLine(msg.ToString());
193+
});
182194
}
183195

184196
public void Dispose()
@@ -270,7 +282,7 @@ private void Hastebin_UploadCompleted(object sender, UploadDataCompletedEventArg
270282
if (config.IRCLogMessages)
271283
LogManager.WriteLog(MsgSendType.DiscordToIRC, msg.Author.Username, result, "log.txt");
272284

273-
session.SendMessage(Session.MessageDestination.IRC, result, msg.Author.Username);
285+
session.SendMessage(Session.TargetBot.IRC, result, msg.Author.Username);
274286
}
275287
}
276288

Diff for: IRC-Relay/IRC-Relay.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
<Reference Include="Meebey.SmartIrc4net, Version=0.4.5.0, Culture=neutral, PublicKeyToken=7868485fbf407e0f, processorArchitecture=MSIL">
6666
<HintPath>..\packages\SmartIrc4net.1.1\lib\Meebey.SmartIrc4net.dll</HintPath>
6767
</Reference>
68+
<Reference Include="Microsoft.CSharp" />
6869
<Reference Include="Microsoft.Extensions.DependencyInjection, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
6970
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.1.1.1\lib\netstandard1.1\Microsoft.Extensions.DependencyInjection.dll</HintPath>
7071
</Reference>
@@ -90,7 +91,6 @@
9091
</Reference>
9192
<Reference Include="System.Xml.Linq" />
9293
<Reference Include="System.Data.DataSetExtensions" />
93-
<Reference Include="Microsoft.CSharp" />
9494
<Reference Include="System.Data" />
9595
<Reference Include="System.Net.Http" />
9696
<Reference Include="System.Xml" />

Diff for: IRC-Relay/IRC.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ private void OnError(object sender, ErrorEventArgs e)
9292
{
9393
/* Create a new thread to kill the session. We cannot block
9494
* this Disconnect call */
95-
new Thread(() => { session.Kill(); }).Start();
95+
new Thread(async() => await session.Kill(Session.TargetBot.Both)).Start();
9696

9797
Discord.Log(new LogMessage(LogSeverity.Critical, "IRCOnError", e.ErrorMessage));
9898
}
@@ -150,7 +150,7 @@ private void OnChannelMessage(object sender, IrcEventArgs e)
150150
}
151151
}
152152

153-
session.SendMessage(Session.MessageDestination.Discord, "**<" + prefix + Regex.Escape(e.Data.Nick) + ">** " + msg);
153+
session.SendMessage(Session.TargetBot.Discord, "**<" + prefix + Regex.Escape(e.Data.Nick) + ">** " + msg);
154154
}
155155
}
156156
}

Diff for: IRC-Relay/Program.cs

+10-2
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,17 @@ public class Program
2828
{
2929
public static void Main(string[] args)
3030
{
31+
dynamic config = null;
3132
Console.Title = "Discord IRC Relay (c) Michael Flaherty 2018";
32-
var config = Config.ApplyJson(new StreamReader("settings.json").ReadToEnd(), new ConfigObject());
33-
33+
try
34+
{
35+
config = Config.ApplyJson(new StreamReader("settings.json").ReadToEnd(), new ConfigObject());
36+
}
37+
catch (FileNotFoundException ex)
38+
{
39+
Console.WriteLine("Startup failure: {0}", ex.Message);
40+
Environment.Exit(0);
41+
}
3442
StartSessions(config).GetAwaiter().GetResult();
3543
}
3644

Diff for: IRC-Relay/Session.cs

+32-9
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,18 @@
1515
* this program. If not, see http://www.gnu.org/licenses/.
1616
*/
1717

18+
using System.Threading;
1819
using System.Threading.Tasks;
1920
using Discord;
2021

2122
namespace IRCRelay
2223
{
2324
public class Session
2425
{
25-
public enum MessageDestination {
26+
public enum TargetBot {
2627
Discord,
27-
IRC
28+
IRC,
29+
Both
2830
};
2931

3032
private Discord discord;
@@ -42,12 +44,33 @@ public Session(dynamic config)
4244
alive = true;
4345
}
4446

45-
public void Kill()
47+
public async Task Kill(TargetBot bot)
4648
{
47-
discord.Dispose();
48-
irc.Client.RfcQuit();
49+
switch (bot)
50+
{
51+
case TargetBot.Discord:
52+
discord.Kill();
53+
await Discord.Log(new LogMessage(LogSeverity.Critical, "KillSesh", "Discord connection closed."));
54+
new Thread(async() =>
55+
{
56+
Thread.Sleep(System.TimeSpan.FromSeconds(1).Milliseconds);
57+
this.discord = new Discord(config, this);
58+
await discord.SpawnBot();
59+
}).Start();
60+
break;
61+
case TargetBot.IRC:
62+
irc.Client.RfcQuit();
63+
await irc.SpawnBot();
64+
await Discord.Log(new LogMessage(LogSeverity.Critical, "KillSesh", "IRC connection closed."));
65+
break;
66+
case TargetBot.Both: // if we kill both, let main loop recover
67+
discord.Kill();
68+
irc.Client.RfcQuit();
69+
this.alive = false;
70+
await Discord.Log(new LogMessage(LogSeverity.Critical, "KillSesh", "Discord connection closed."));
71+
break;
72+
}
4973

50-
Discord.Log(new LogMessage(LogSeverity.Critical, "KillSesh", "Session killed."));
5174
this.alive = false;
5275
}
5376

@@ -61,14 +84,14 @@ public async Task StartSession()
6184
await irc.SpawnBot();
6285
}
6386

64-
public void SendMessage(MessageDestination dest, string message, string username = "")
87+
public void SendMessage(TargetBot dest, string message, string username = "")
6588
{
6689
switch (dest)
6790
{
68-
case MessageDestination.Discord:
91+
case TargetBot.Discord:
6992
discord.SendMessageAllToTarget(config.DiscordGuildName, message, config.DiscordChannelName);
7093
break;
71-
case MessageDestination.IRC:
94+
case TargetBot.IRC:
7295
irc.SendMessage(username, message);
7396
break;
7497
}

0 commit comments

Comments
 (0)