Exemplo n.º 1
0
        public async Task MainAsync()
        {
            this.startTime = DateTime.UtcNow;
            var settings = JsonConvert.DeserializeObject <Settings>(File.ReadAllText("config.json"));

            var discordApi = new DiscordApi();
            await discordApi.StartAsync(settings.DiscordToken).ConfigureAwait(false);

            var ssApi = new StarSonataApi();

            ssApi.SetServerUrl(settings.ServerUrl);
            ssApi.Initialise();
            this.TryGameLoginAsync(ssApi, discordApi, settings).Forget();

            discordApi.WhenMessageRecieved.Subscribe(
                msg =>
            {
                if (msg.Author.Id == settings.BotDiscordId)
                {
                    return;
                }

                if (msg.Channel.Id == settings.CommandChannel)
                {
                    this.HandleCommands(settings, discordApi, ssApi, msg.Text);
                    return;
                }

                if (this.AppState != EAppState.Ready)
                {
                    return;
                }

                var channelMapping =
                    settings.ChannelMappings.Discord.FirstOrDefault(c => c.Discord == msg.Channel.Id);
                if (channelMapping == null)
                {
                    return;
                }

                try
                {
                    // ssApi.SendImpersonationChatAsync(channelMapping.Game, msg.Author.Name, msg.Text);
                    ssApi.SendChatAsync($"<{msg.Author.Name}>: {msg.Text}", (MessageChannel)Enum.Parse(typeof(MessageChannel), channelMapping.Game));
                }
                catch (Exception)
                {
                    lock (this)
                    {
                        this.lastError = DateTime.Now;
                    }

                    discordApi.SendMessageAsync(
                        settings.ErrorChannel,
                        "Error: Failed to send a message. Likely disconnected").Forget();

                    this.TryGameLoginAsync(ssApi, discordApi, settings).Forget();
                }
            });

            // Login as the first available character
            ssApi.WhenMessageReceived.Where(msg => msg is CharacterList).Subscribe(
                msg =>
            {
                var characterList = (CharacterList)msg;
                var character     =
                    characterList.Characters.FirstOrDefault(c =>
                                                            c.Name.ToLower() == settings.CharacterName.ToLower());
                if (character == null)
                {
                    character = characterList.Characters.First();
                    Console.WriteLine($"Could not find character with name {settings.CharacterName}, falling back to first character ({character.Name})");
                }

                Console.WriteLine("Logging in as " + character.Name);
                ssApi.SendMessage(new SelectCharacter(character));
            });

            ssApi.WhenMessageReceived.Where(m => !string.IsNullOrEmpty((m as TextMessage)?.Message?.Username))
            .Subscribe(
                m =>
            {
                var msg            = (TextMessage)m;
                var channelMapping =
                    settings.ChannelMappings.Game.FirstOrDefault(
                        c => c.Game == msg.Message.Channel.ToString());
                if (channelMapping == null)
                {
                    return;
                }

                try
                {
                    discordApi.SendMessageAsync(
                        channelMapping.Discord,
                        msg.Message.Username,
                        msg.Message.Message).Forget();
                }
                catch (Exception e)
                {
                    Console.Error.WriteLine("Error sending discord message. " + e.Message);
                }
            });

            await Task.Delay(-1).ConfigureAwait(false);
        }