aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS.Server/ChatBackend.cs
blob: f3d1dee3b01ba1593230a81af96ce9000e8acd04 (plain) (blame)
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ShiftOS.Objects;
using NetSockets;
using Newtonsoft.Json;
using System.IO;
using static ShiftOS.Server.Program;
using Discord;

namespace ShiftOS.Server
{
    public static class ChatBackend
    {
        public static void StartDiscordBots()
        {
            Reinitialized?.Invoke();
            foreach (var chat in JsonConvert.DeserializeObject<List<ShiftOS.Objects.Channel>>(File.ReadAllText("chats.json")))
            {

                bool chatKilled = false;
                if (chat.IsDiscordProxy == true)
                {
                    DiscordConfigBuilder builder = new DiscordConfigBuilder();
                    builder.AppName = "ShiftOS";
                    builder.AppVersion = System.Reflection.Assembly.GetExecutingAssembly().FullName;
                    builder.AppUrl = "http://getshiftos.ml/";
                    var client = new DiscordClient(builder);
                    client.Connect(chat.DiscordBotToken, TokenType.Bot);
                    client.SetGame("ShiftOS");
                    client.SetStatus(UserStatus.Online);
                    client.MessageReceived += (s, e) =>
                    {
                        if (chatKilled == false)
                        {
                            if (e.Channel.Id.ToString() == chat.DiscordChannelID)
                            {
                                server.DispatchAll(new NetObject("chat_msgreceived", new ServerMessage
                                {
                                    Name = "chat_msgreceived",
                                    GUID = "server",
                                    Contents = JsonConvert.SerializeObject(new ChatMessage(e.User.Name, "discord_" + e.Channel.Name, e.Message.Text, chat.ID))
                                }));
                            }
                        }
                    };
                    MessageReceived += (g, msg) =>
                    {
                        if (chatKilled == false)
                        {
                            //Determine if the message was sent to this channel.
                            if (msg.Channel == chat.ID)
                            {
                                //Get the Discord channel for this chat.
                                var dChan = client.GetChannel(Convert.ToUInt64(chat.DiscordChannelID));
                                //Relay the message to Discord.
                                dChan.SendMessage($"**[{msg.Username}@{msg.SystemName} ({msg.Channel})]: {msg.Message}");

                            }
                            //Relay it back to all MUD clients.
                            RelayMessage(g, msg);
                        }
                    };
                    Reinitialized += () =>
                    {
                        client.Disconnect();
                        client.Dispose();
                        chatKilled = true;
                    };
                }
                else
                {
                    MessageReceived += (g, msg) =>
                    {
                        if (chatKilled == false)
                        {
                            //Just relay it.
                            RelayMessage(g, msg);
                        }
                    };
                    Reinitialized += () => { chatKilled = true; };
                }
            }
        }

        internal static void RelayMessage(string guid, ChatMessage msg)
        {
            server.DispatchAllExcept(new Guid(guid), new NetObject("chat_msgreceived", new ServerMessage
            {
                Name = "chat_msgreceived",
                GUID = "server",
                Contents = JsonConvert.SerializeObject(msg)
            }));

        }

        public static event Action<string, ChatMessage> MessageReceived;
        public static event empty Reinitialized;


        public delegate void empty();

        [MudRequest("chat_send")]
        public static void ReceiveMessage(string guid, object contents)
        {
            var msg = JsonConvert.DeserializeObject<ChatMessage>(JsonConvert.SerializeObject(contents));
            MessageReceived?.Invoke(guid, msg);

        }
    }
}