private void CleanRelay(TerrChannelRelay relay) { if (!_relays.Contains(relay)) { Logger.FormattedWrite("TerrariaRelay", $"CleanRelay tried to clean unregisted relay.", ConsoleColor.Red); return; } relay.Client.MessageReceived -= relay.TerrariaMessageReceivedEvent; relay.Client.Disconnected -= relay.TerrariaDisconnectedEvent; _client.MessageReceived -= relay.DiscordMessageReceivedEvent; relay.Client.LoggedIn -= relay.TerrariaOnLoginEvent; _relays.Remove(relay); relay.Client.SocketDispose(); }
private async Task <bool> StartClient(TerrChannelRelay relay) { try { if (relay.Channel == null) { relay.Channel = _client.GetChannel(relay.ChannelId); } if (relay.Channel == null) { return(false); } relay.Client = new TerrariaClient(cfg => { if (string.IsNullOrEmpty(relay.Password)) { cfg.Password(relay.Password); } cfg.TrackItems(false); cfg.TrackProjectiles(false); cfg.Player(player => { player.Appearance(appear => appear.Name(relay.Channel.Name)); player.Buffs(buffs => buffs.Add(BuffId.Invisibility)); }); }); // create event handlers relay.TerrariaMessageReceivedEvent = async(s, e) => { if (e.Message.Text.StartsWith(EscapePrefix)) { return; } await relay.Channel.SafeSendMessage($"**Terraria**: `<{e.Player.Appearance.Name}> {e.Message.Text}`"); }; relay.TerrariaDisconnectedEvent = async(s, e) => { await relay.Channel.SafeSendMessage($"Disconnected from terraria server: `{e.Reason}`"); CleanRelay(relay); }; relay.DiscordMessageReceivedEvent = (s, e) => { if (e.Channel.Id != relay.ChannelId) { return; } if (e.Message.Text.StartsWith(EscapePrefix)) { return; } char?commandChar = _client.Commands().Config.PrefixChar; if (commandChar != null) { if (e.Message.Text.StartsWith(commandChar.Value.ToString())) { return; } } if (e.Message.IsAuthor) { return; } relay.Client.CurrentPlayer.SendMessage($"<{e.User.Name}> {e.Message.Text}"); }; relay.TerrariaOnLoginEvent = (s, e) => relay.Client.CurrentPlayer.Killme(" says hi."); //set handlers relay.Client.MessageReceived += relay.TerrariaMessageReceivedEvent; relay.Client.Disconnected += relay.TerrariaDisconnectedEvent; _client.MessageReceived += relay.DiscordMessageReceivedEvent; relay.Client.LoggedIn += relay.TerrariaOnLoginEvent; relay.Client.Log.MessageReceived += (s, e) => Logger.FormattedWrite(e.Severity.ToString(), e.Message, ConsoleColor.White); relay.Client.ConnectAndLogin(relay.Host, relay.Port); await relay.Channel.SafeSendMessage($"Connected to `{relay.Host}:{relay.Port}`"); return(true); } catch (Exception ex) { await relay.Channel.SafeSendMessage( $"Couldn't relay terraria server at {relay.Host}:{relay.Port}. Exception:\r\n`{ex.Message}`"); CleanRelay(relay); } return(false); }
void IModule.Install(ModuleManager manager) { _client = manager.Client; manager.CreateDynCommands("terraria", PermissionLevel.User, mainGroup => { // commands which can only be used when caller channel is connected to a terraria server. mainGroup.CreateGroup("", connectedGroup => { connectedGroup.AddCheck( (cmd, usr, chnl) => GetRelay(chnl) != null); /* * todo : command for getting player info */ connectedGroup.CreateCommand("info") .Description("Shows the info for the terraria server connected to this channel.") .Do(async e => { TerrChannelRelay relay = GetRelay(e.Channel); await e.Channel.SafeSendMessage( $"This channel is connected to:\r\n```* Ip: {relay.Host}\r\n* Port:{relay.Port}\r\n* World: {relay.Client.World.WorldName}\r\n* Players: {relay.Client.Players.Count()}```"); }); connectedGroup.CreateCommand("disconnect") .MinDynPermissions((int)PermissionLevel.ChannelModerator) .Description("Disconnects from the terraria server connected to this channel.") .Do(e => { TerrChannelRelay relay = GetRelay(e.Channel); CleanRelay(relay); }); connectedGroup.CreateCommand("world") .Description("Displays information about the servers world.") .Do(async e => { TerrChannelRelay relay = GetRelay(e.Channel); StringBuilder builder = new StringBuilder($"**World data on {relay.Host}:{relay.Port}:**```"); builder.AppendLine($"- Name: {relay.Client.World.WorldName}"); builder.AppendLine($"- Time: {relay.Client.World.Time}"); builder.AppendLine($"- Is Raining: {relay.Client.World.Rain > 0}"); builder.AppendLine($"- Is Expert Mode: {relay.Client.World.IsExpertMode}"); builder.AppendLine($"- Is Hardmode: {relay.Client.World.IsHardmode}"); builder.AppendLine($"- Is Crimson: {relay.Client.World.IsCrimson}"); await e.Channel.SafeSendMessage($"{builder}```"); }); connectedGroup.CreateCommand("travmerch") .Description( "Displays what the travelling merchant has in stock if they are currently present in the world.") .Do(async e => { TerrChannelRelay relay = GetRelay(e.Channel); Npc travelingMerchant = relay.Client.Npcs.FirstOrDefault(n => n.NpcId == NpcId.TravellingMerchant); if (travelingMerchant == null) { await e.Channel.SafeSendMessage( "The travelling merchant is not currently present in the world."); return; } StringBuilder builder = new StringBuilder("**Travelling merchant stock:**```"); int index = 1; foreach (GameItem item in travelingMerchant.Shop) { builder.AppendLine($"{index}: {item.Name()}"); index++; } await e.Channel.SafeSendMessage($"{builder}```"); }); }); // commands which can only be used when caller channel is not connected to a terraria server. mainGroup.CreateGroup("", disconnectedGroup => { disconnectedGroup.AddCheck((cmd, usr, chnl) => GetRelay(chnl) == null); disconnectedGroup.CreateCommand("connect") .MinDynPermissions((int)PermissionLevel.ChannelModerator) .Description("Connects this channel to a terraria server.") .Parameter("ip") .Parameter("port") .Parameter("password", ParameterType.Optional) .Do(async e => { TerrChannelRelay newRelay = new TerrChannelRelay(e.Channel, e.GetArg("ip"), int.Parse(e.GetArg("port")), e.GetArg("password")); _relays.Add(newRelay); await StartClient(newRelay); }); }); }); }
void IModule.Install(ModuleManager manager) { _client = manager.Client; manager.CreateDynCommands("terraria", PermissionLevel.User, mainGroup => { // commands which can only be used when caller channel is connected to a terraria server. mainGroup.CreateGroup("", connectedGroup => { connectedGroup.AddCheck( (cmd, usr, chnl) => GetRelay(chnl) != null); /* todo : command for getting player info */ connectedGroup.CreateCommand("info") .Description("Shows the info for the terraria server connected to this channel.") .Do(async e => { TerrChannelRelay relay = GetRelay(e.Channel); await e.Channel.SafeSendMessage( $"This channel is connected to:\r\n```* Ip: {relay.Host}\r\n* Port:{relay.Port}\r\n* World: {relay.Client.World.WorldName}\r\n* Players: {relay.Client.Players.Count()}```"); }); connectedGroup.CreateCommand("disconnect") .MinDynPermissions((int) PermissionLevel.ChannelModerator) .Description("Disconnects from the terraria server connected to this channel.") .Do(e => { TerrChannelRelay relay = GetRelay(e.Channel); CleanRelay(relay); }); connectedGroup.CreateCommand("world") .Description("Displays information about the servers world.") .Do(async e => { TerrChannelRelay relay = GetRelay(e.Channel); StringBuilder builder = new StringBuilder($"**World data on {relay.Host}:{relay.Port}:**```"); builder.AppendLine($"- Name: {relay.Client.World.WorldName}"); builder.AppendLine($"- Time: {relay.Client.World.Time}"); builder.AppendLine($"- Is Raining: {relay.Client.World.Rain > 0}"); builder.AppendLine($"- Is Expert Mode: {relay.Client.World.IsExpertMode}"); builder.AppendLine($"- Is Hardmode: {relay.Client.World.IsHardmode}"); builder.AppendLine($"- Is Crimson: {relay.Client.World.IsCrimson}"); await e.Channel.SafeSendMessage($"{builder}```"); }); connectedGroup.CreateCommand("travmerch") .Description( "Displays what the travelling merchant has in stock if they are currently present in the world.") .Do(async e => { TerrChannelRelay relay = GetRelay(e.Channel); Npc travelingMerchant = relay.Client.Npcs.FirstOrDefault(n => n.NpcId == NpcId.TravellingMerchant); if (travelingMerchant == null) { await e.Channel.SafeSendMessage( "The travelling merchant is not currently present in the world."); return; } StringBuilder builder = new StringBuilder("**Travelling merchant stock:**```"); int index = 1; foreach (GameItem item in travelingMerchant.Shop) { builder.AppendLine($"{index}: {item.Name()}"); index++; } await e.Channel.SafeSendMessage($"{builder}```"); }); }); // commands which can only be used when caller channel is not connected to a terraria server. mainGroup.CreateGroup("", disconnectedGroup => { disconnectedGroup.AddCheck((cmd, usr, chnl) => GetRelay(chnl) == null); disconnectedGroup.CreateCommand("connect") .MinDynPermissions((int) PermissionLevel.ChannelModerator) .Description("Connects this channel to a terraria server.") .Parameter("ip") .Parameter("port") .Parameter("password", ParameterType.Optional) .Do(async e => { TerrChannelRelay newRelay = new TerrChannelRelay(e.Channel, e.GetArg("ip"), int.Parse(e.GetArg("port")), e.GetArg("password")); _relays.Add(newRelay); await StartClient(newRelay); }); }); }); }
private async Task<bool> StartClient(TerrChannelRelay relay) { try { if (relay.Channel == null) relay.Channel = _client.GetChannel(relay.ChannelId); if (relay.Channel == null) return false; relay.Client = new TerrariaClient(cfg => { if (string.IsNullOrEmpty(relay.Password)) cfg.Password(relay.Password); cfg.TrackItems(false); cfg.TrackProjectiles(false); cfg.Player(player => { player.Appearance(appear => appear.Name(relay.Channel.Name)); player.Buffs(buffs => buffs.Add(BuffId.Invisibility)); }); }); // create event handlers relay.TerrariaMessageReceivedEvent = async (s, e) => { if (e.Message.Text.StartsWith(EscapePrefix)) return; await relay.Channel.SafeSendMessage($"**Terraria**: `<{e.Player.Appearance.Name}> {e.Message.Text}`"); }; relay.TerrariaDisconnectedEvent = async (s, e) => { await relay.Channel.SafeSendMessage($"Disconnected from terraria server: `{e.Reason}`"); CleanRelay(relay); }; relay.DiscordMessageReceivedEvent = (s, e) => { if (e.Channel.Id != relay.ChannelId) return; if (e.Message.Text.StartsWith(EscapePrefix)) return; char? commandChar = _client.Commands().Config.PrefixChar; if (commandChar != null) if (e.Message.Text.StartsWith(commandChar.Value.ToString())) return; if (e.Message.IsAuthor) return; relay.Client.CurrentPlayer.SendMessage($"<{e.User.Name}> {e.Message.Text}"); }; relay.TerrariaOnLoginEvent = (s, e) => relay.Client.CurrentPlayer.Killme(" says hi."); //set handlers relay.Client.MessageReceived += relay.TerrariaMessageReceivedEvent; relay.Client.Disconnected += relay.TerrariaDisconnectedEvent; _client.MessageReceived += relay.DiscordMessageReceivedEvent; relay.Client.LoggedIn += relay.TerrariaOnLoginEvent; relay.Client.Log.MessageReceived += (s, e) => Logger.FormattedWrite(e.Severity.ToString(), e.Message, ConsoleColor.White); relay.Client.ConnectAndLogin(relay.Host, relay.Port); await relay.Channel.SafeSendMessage($"Connected to `{relay.Host}:{relay.Port}`"); return true; } catch (Exception ex) { await relay.Channel.SafeSendMessage( $"Couldn't relay terraria server at {relay.Host}:{relay.Port}. Exception:\r\n`{ex.Message}`"); CleanRelay(relay); } return false; }