/* TShock, a server mod for Terraria Copyright (C) 2011-2015 Nyx Studios (fka. The TShock Team) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ using System; using System.IO; using TShockAPI.ServerSideCharacters; namespace TShockAPI { public class FileTools { /// /// Path to the file containing the rules. /// internal static string RulesPath { get { return Path.Combine(TShock.SavePath, "rules.txt"); } } /// /// Path to the file containing the message of the day. /// internal static string MotdPath { get { return Path.Combine(TShock.SavePath, "motd.txt"); } } /// /// Path to the file containing the whitelist. /// internal static string WhitelistPath { get { return Path.Combine(TShock.SavePath, "whitelist.txt"); } } /// /// Path to the file containing the config. /// internal static string ConfigPath { get { return Path.Combine(TShock.SavePath, "config.json"); } } /// /// Path to the file containing the config. /// internal static string ServerSideCharacterConfigPath { get { return Path.Combine(TShock.SavePath, "sscconfig.json"); } } /// /// Creates an empty file at the given path. /// /// The path to the file. public static void CreateFile(string file) { File.Create(file).Close(); } /// /// Creates a file if the files doesn't already exist. /// /// The path to the files /// The data to write to the file. public static void CreateIfNot(string file, string data = "") { if (!File.Exists(file)) { File.WriteAllText(file, data); } } /// /// Sets up the configuration file for all variables, and creates any missing files. /// public static void SetupConfig() { if (!Directory.Exists(TShock.SavePath)) { Directory.CreateDirectory(TShock.SavePath); } CreateIfNot(RulesPath, "Respect the admins!\nDon't use TNT!"); CreateIfNot(MotdPath, "This server is running TShock for Terraria.\n Type /help for a list of commands.\n%255,000,000%Current map: %map%\nCurrent players: %players%"); CreateIfNot(WhitelistPath); if (File.Exists(ConfigPath)) { TShock.Config = ConfigFile.Read(ConfigPath); // Add all the missing config properties in the json file } TShock.Config.Write(ConfigPath); if (File.Exists(ServerSideCharacterConfigPath)) { TShock.ServerSideCharacterConfig = ServerSideConfig.Read(ServerSideCharacterConfigPath); // Add all the missing config properties in the json file } TShock.ServerSideCharacterConfig.Write(ServerSideCharacterConfigPath); } /// /// Tells if a user is on the whitelist /// /// string ip of the user /// true/false public static bool OnWhitelist(string ip) { if (!TShock.Config.EnableWhitelist) { return true; } CreateIfNot(WhitelistPath, "127.0.0.1"); using (var tr = new StreamReader(WhitelistPath)) { string whitelist = tr.ReadToEnd(); ip = TShock.Utils.GetRealIP(ip); bool contains = whitelist.Contains(ip); if (!contains) { foreach (var line in whitelist.Split(Environment.NewLine.ToCharArray())) { if (string.IsNullOrWhiteSpace(line)) continue; contains = TShock.Utils.GetIPv4Address(line).Equals(ip); if (contains) return true; } return false; } return true; } } } }