Delete MUD webadmin.

This commit is contained in:
Michael 2017-04-02 19:14:11 -04:00
parent 3137224754
commit 29a88a5c46
15 changed files with 0 additions and 1524 deletions

View file

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Interactive.Async" publicKeyToken="94bc3704cddfc263" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.0.1000.0" newVersion="3.0.1000.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View file

@ -1,808 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Nancy;
using Nancy.Authentication.Forms;
using Nancy.Bootstrapper;
using Nancy.Hosting.Self;
using Nancy.ModelBinding;
using Nancy.Security;
using Nancy.TinyIoc;
using Newtonsoft.Json;
using ShiftOS.Objects;
namespace ShiftOS.Server.WebAdmin
{
class Program
{
static void Main(string[] args)
{
var HostConf = new HostConfiguration();
HostConf.UrlReservations.CreateAutomatically = true;
HostConf.RewriteLocalhost = true;
using(var nancy = new NancyHost(HostConf, new Uri("http://localhost:13371/mudadmin/")))
{
nancy.Start();
Console.WriteLine($"[{DateTime.Now}] <AdminPanel/NancyInit> Initiating on localhost:13371...");
Console.ReadLine();
}
}
}
public static class PageBuilder
{
public static string Build(string page, Dictionary<string, string> templateParams = null)
{
string templatehtml = Properties.Resources.HtmlTemplate;
if (templateParams == null)
{
templateParams = new Dictionary<string, string>();
}
if (!templateParams.ContainsKey("{logout}"))
{
templateParams.Add("{logout}", "<li><a href=\"/mudadmin/logout\">Log out</a></li>");
}
if (SystemManager.MudIsRunning())
{
templateParams.Add("{mud_power}", "<li><a href='/mudadmin/poweroff'><span class='glyphicon glyphicon-power-off'></span> Power off</a></li>");
templateParams.Add("{mud_restart}", "<li><a href='/mudadmin/restart'><span class='glyphicon glyphicon-refresh'></span> Restart</a></li>");
}
else
{
templateParams.Add("{mud_power}", "<li><a href='/mudadmin/poweron'><span class='glyphicon glyphicon-power-on'></span> Power on</a></li>");
templateParams.Add("{mud_restart}", "");
}
if(templateParams["{logout}"] == "")
{
templateParams["{mud_power}"] = "";
templateParams["{mud_restart}"] = "";
}
switch (page)
{
case "status":
templatehtml = templatehtml.Replace("{body}", Properties.Resources.Status);
break;
case "login":
templatehtml = templatehtml.Replace("{body}", Properties.Resources.LoginView);
break;
case "initialsetup":
templatehtml = templatehtml.Replace("{body}", Properties.Resources.SetupView);
break;
}
try
{
foreach (var param in templateParams)
{
templatehtml = templatehtml.Replace(param.Key, param.Value);
}
}
catch { }
return templatehtml;
}
}
public class MudUserIdentity : IUserIdentity
{
public MudUserIdentity(string username)
{
_username = username;
}
public IEnumerable<string> Claims
{
get
{
return SystemManager.GetClaims(_username);
}
}
private string _username = "";
public string UserName
{
get
{
return _username;
}
}
}
public static class SystemManager
{
public static bool MudIsRunning()
{
var processes = System.Diagnostics.Process.GetProcessesByName("ShiftOS.Server");
return processes.Length > 0;
}
public static void KillMud()
{
var processes = System.Diagnostics.Process.GetProcessesByName("ShiftOS.Server");
for(int i = 0; i < processes.Length; i++)
{
try
{
processes[i].Kill();
}
catch
{
}
}
}
public static List<string> GetClaims(string username)
{
foreach(var save in GetSaves())
{
if (save.IsMUDAdmin)
{
return new List<string> { "User", "Admin" };
}
}
return new List<string>(new[] { "User" });
}
public static Save[] GetSaves()
{
List<Save> saves = new List<Save>();
if (Directory.Exists("saves"))
{
foreach(var saveFile in Directory.GetFiles("saves"))
{
try
{
saves.Add(JsonConvert.DeserializeObject<Save>(Server.Program.ReadEncFile(saveFile)));
}
catch { }
}
}
return saves.ToArray();
}
public static bool Login(string username, string password, out Guid id)
{
foreach (var user in GetSaves())
{
if (user.Username == username && user.Password == password)
{
id = user.ID;
return true;
}
}
id = new Guid();
return false;
}
public static string BuildFormFromObject(object obj)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("<form method='post' action=''><table class='table'>");
foreach(var prop in obj.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
{
string name = "";
string description = "No description.";
foreach(var attrib in prop.GetCustomAttributes(false))
{
if(attrib is FriendlyNameAttribute)
{
name = (attrib as FriendlyNameAttribute).Name;
}
if(attrib is FriendlyDescriptionAttribute)
{
description = (attrib as FriendlyDescriptionAttribute).Description;
}
}
if (name != "")
{
sb.AppendLine("<tr>");
sb.AppendLine($@"<td width=""45%"">
<p><strong>{name}</strong></p>
<p>{description}</p>
</td>
<td>");
if (prop.PropertyType == typeof(bool))
{
string isChecked = ((bool)prop.GetValue(obj) == true) ? "checked" : "";
sb.AppendLine($"<input class='form-control' type='checkbox' name='{prop.Name}' {isChecked}/>");
}
else if (prop.PropertyType == typeof(string))
{
sb.AppendLine($"<input class='form-control' type='text' name='{prop.Name}' value='{prop.GetValue(obj)}'/>");
}
sb.AppendLine("</td></tr>");
}
else
{
sb.AppendLine($"<input type='hidden' name='{prop.Name}' value='{prop.GetValue(obj)}'/>");
}
}
sb.AppendLine("<tr><td></td><td><input class='btn btn-default' type='submit'/></td></tr>");
sb.AppendLine("</table></form>");
return sb.ToString();
}
public static Channel GetChat(string id)
{
if (File.Exists("chats.json"))
foreach (var channel in JsonConvert.DeserializeObject<List<Channel>>(File.ReadAllText("chats.json")))
{
if (channel.ID == id)
return channel;
}
return new Channel();
}
public static string BuildSaveListing(Save[] list)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("<table class=\"table\">");
sb.AppendLine(@"<tr>
<td><strong>Username</strong></td>
<td><strong>System Name</strong></td>
<td><strong>Codepoints</strong></td>
<td><strong>Shiftorium Upgrades</strong></td>
<td><strong>Is MUD Admin</strong></td>
<td><strong>Actions</strong></td>
</tr>");
foreach(var save in list)
{
sb.AppendLine($@"<tr>
<td>{save.Username}</td>
<td>{save.SystemName}</td>
<td>{save.Codepoints}</td>
<td>{save.CountUpgrades()} installed, {save.Upgrades.Count} total</td>
<td>{save.IsMUDAdmin}</td>
<td>
<a href=""/mudadmin/toggleadmin/{save.Username}"" class=""btn btn-danger"">Toggle admin</a>
<a href=""/mudadmin/deletesave/{save.Username}"" class=""btn btn-danger"">Delete save</a>
</td>
</tr>");
}
sb.AppendLine("</table>");
return sb.ToString();
}
public static string GetAllChats()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("<table class=\"table\">");
sb.AppendLine($@"<tr><td><strong>ID</strong></td>
<td><strong>Name</strong></td>
<td><strong>Topic</strong></td>
<td><strong>Is Discord Relay</strong></td>
<td><strong>Discord channel ID</strong></td>
<td><strong>Discord Bot Token</strong></td>
<td><strong>Actions</strong></td></tr>");
if (File.Exists("chats.json"))
{
foreach(var chat in JsonConvert.DeserializeObject<List<Channel>>(File.ReadAllText("chats.json")))
{
sb.AppendLine($@"<tr>
<td>{chat.ID}</td>
<td>{chat.Name}</td>
<td>{chat.Topic}</td>
<td>{chat.IsDiscordProxy}</td>
<td>{chat.DiscordChannelID}</td>
<td>{chat.DiscordBotToken}</td>
<td>
<a href=""/mudadmin/editchat/{chat.ID}"" class=""btn btn-default""><span class=""glyphicon glyphicon-pencil""></span>Edit</a>
<a href=""#"" class=""btn btn-default"" data-toggle=""modal"" data-target=""#modal_{chat.ID}""><span class=""glyphicon glyphicon-delete""></span> Delete</a>
</td>
</tr>");
sb.AppendLine(CreateModal(chat.ID, "Delete " + chat.Name + "?", "Are you sure you want to delete this chat?", "/deletechat/" + chat.ID));
}
}
sb.AppendLine("</table>");
return sb.ToString();
}
public static string CreateModal(string id, string title, string msg, string callbackUrl)
{
return $@"<div id=""modal_{id}"" class=""modal fade"" role=""dialog"">
<div class=""modal-dialog"">
<!-- Modal content-->
<div class=""modal-content"">
<div class=""modal-header"">
<button type=""button"" class=""close"" data-dismiss=""modal"">&times;</button>
<h4 class=""modal-title"">{title}</h4>
</div>
<div class=""modal-body"">
<p>{msg}</p>
</div>
<div class=""modal-footer"">
<a href=""/mudadmin{callbackUrl}"" class=""btn btn-danger"">Yes</a>
<button type=""button"" class=""btn btn-default"" data-dismiss=""modal"">No</button>
</div>
</div>
</div>
</div>";
}
public static string GetCPWorth()
{
if (System.IO.Directory.Exists("saves"))
{
long cp = 0;
foreach(var file in System.IO.Directory.GetFiles("saves"))
{
if (file.EndsWith(".save"))
{
var save = JsonConvert.DeserializeObject<Save>(Server.Program.ReadEncFile(file));
cp += save.Codepoints;
}
}
return cp.ToString();
}
else
{
return "0";
}
}
public static string GetUserCount()
{
if (System.IO.Directory.Exists("saves"))
{
return System.IO.Directory.GetFiles("saves").Length.ToString();
}
else
{
return "0";
}
}
public static MudUserIdentity GetIdentity(Guid id)
{
foreach (var user in GetSaves())
{
if (user.ID == id)
{
return new WebAdmin.MudUserIdentity(user.Username);
}
}
return null;
}
internal static void MakeAdmin(string username)
{
Save sav = null;
foreach(var save in GetSaves())
{
if (save.Username == username)
sav = save;
}
if(sav != null)
{
sav.IsMUDAdmin = true;
Server.Program.WriteEncFile("saves/" + username + ".save", JsonConvert.SerializeObject(sav));
}
}
internal static Save[] GetAdmins()
{
var saves = new List<Save>();
foreach(var save in GetSaves())
{
if(save.IsMUDAdmin == true)
{
saves.Add(save);
}
}
return saves.ToArray();
}
}
public class MudUser
{
[FriendlyName("Username")]
[FriendlyDescription("The username you will appear as in-game.")]
public string Username { get; set; }
[FriendlyName("Password")]
[FriendlyDescription("A password that you will use to log in to the admin panel and the game.")]
public string Password { get; set; }
[FriendlyName("System name")]
[FriendlyDescription("An in-game hostname for your account. In ShiftOS, your user ID is always yourusername@yoursystemname. Be creative.")]
public string SystemName { get; set; }
public Guid ID { get; set; }
}
public class MudBootstrapper : DefaultNancyBootstrapper
{
protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
{
var formsAuthConfiguration = new FormsAuthenticationConfiguration();
formsAuthConfiguration.RedirectUrl = "~/login";
formsAuthConfiguration.UserMapper = container.Resolve<IUserMapper>();
FormsAuthentication.Enable(pipelines, formsAuthConfiguration);
base.ApplicationStartup(container, pipelines);
}
}
public class MudUserMapper : IUserMapper
{
public IUserIdentity GetUserFromIdentifier(Guid identifier, NancyContext context)
{
return SystemManager.GetIdentity(identifier);
}
}
public class LoginModule : NancyModule
{
public LoginModule()
{
Get["/login"] = parameters =>
{
if (SystemManager.GetSaves().Length > 0)
{
if (SystemManager.GetAdmins().Length > 0)
{
return PageBuilder.Build("login", new Dictionary<string, string>
{
{"{logout}", "" }
});
}
else
{
return PageBuilder.Build("initialsetup", new Dictionary<string, string>
{
{"{logout}", "" },
{"{savelist}", BuildSaveList() }
});
}
}
else
{
return PageBuilder.Build("bla", new Dictionary<string, string>
{
{"{body}", Properties.Resources.NoUsersFound },
{"{user_create_form}", SystemManager.BuildFormFromObject(new MudUser()) }
});
}
};
Get["/logout"] = parameters =>
{
return this.Logout("~/");
};
Post["/login"] = parameters =>
{
if (SystemManager.GetSaves().Length > 0)
{
if (SystemManager.GetAdmins().Length == 0)
{
var user = this.Bind<LoginRequest>();
SystemManager.MakeAdmin(user.username);
Guid id = new Guid();
if(SystemManager.Login(user.username, user.password, out id) == true)
{
return this.Login(id);
}
return new UserModule().Redirect("/login");
}
else
{
var user = this.Bind<LoginRequest>();
Guid id = new Guid();
if (SystemManager.Login(user.username, user.password, out id) == true)
{
return this.Login(id);
}
return new UserModule().Redirect("/login");
}
}
else
{
var newUser = this.Bind<MudUser>();
var save = new Save();
save.Username = newUser.Username;
save.SystemName = newUser.SystemName;
save.Password = newUser.Password;
save.Codepoints = 0;
save.MyShop = "";
save.Upgrades = new Dictionary<string, bool>();
save.IsMUDAdmin = true;
save.StoryPosition = 1;
if (!Directory.Exists("saves"))
Directory.CreateDirectory("saves");
save.ID = Guid.NewGuid();
Server.Program.WriteEncFile("saves/" + save.Username + ".save", JsonConvert.SerializeObject(save));
return this.Login(save.ID);
}
};
}
private string BuildSaveList()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("<table class='table'>");
sb.AppendLine($@"<tr>
<td><strong>Username</strong></td>
<td><strong>System name</strong></td>
<td><strong>Codepoints</strong></td>
<td><strong>Actions</strong></td>
</tr>");
foreach(var save in SystemManager.GetSaves())
{
sb.AppendLine($@"<tr>
<td>{save.Username}</td>
<td>{save.SystemName}</td>
<td>{save.Codepoints}</td>
<td><form method='post' action=''>
<input type='hidden' name='username' value='{save.Username}'/><input type='hidden' name='password' value='{save.Password}'/>
<input type='submit' value='Choose' class='btn btn-default'/>
</form></td>
</tr>");
}
sb.AppendLine("</table>");
return sb.ToString();
}
}
public class UserModule : NancyModule
{
public string Redirect(string url)
{
return $@"<html>
<head>
<meta http-equiv=""refresh"" content=""0; url=/mudadmin{url}"" />
</ head>
</html>";
}
public UserModule()
{
this.RequiresAuthentication();
this.RequiresClaims("Admin");
Get["/"] = _ =>
{
return Redirect("/status");
};
Get["/toggleadmin/{id}"] = parameters =>
{
string id = parameters.id;
for (int i = 0; i < SystemManager.GetSaves().Length; i++)
{
var save = SystemManager.GetSaves()[i];
if(save.Username.ToString() == id)
{
save.IsMUDAdmin = !save.IsMUDAdmin;
Server.Program.WriteEncFile("saves/" + save.Username + ".save", JsonConvert.SerializeObject(save));
}
}
return Redirect("/saves");
};
Get["/deletesave/{username}"] = parameters =>
{
string id = parameters.username;
for (int i = 0; i < SystemManager.GetSaves().Length; i++)
{
if (SystemManager.GetSaves()[i].Username.ToString() == id)
{
File.Delete("saves/" + SystemManager.GetSaves()[i].Username + ".save");
}
}
return Redirect("/saves");
};
Get["/saves"] = _ =>
{
return PageBuilder.Build("bla", new Dictionary<string, string>
{
{ "{body}", Properties.Resources.GenericTableList },
{ "{listtitle}", "Test subjects" },
{ "{listdesc}", "Below is a list of test subjects (save files) on your multi-user domain. You can see their username, system name, Codepoints, amount of installed upgrades, and you can also perform basic actions on each save." },
{ "{list}", SystemManager.BuildSaveListing(SystemManager.GetSaves()) }
});
};
Get["/status"] = _ =>
{
return statusBuilder();
};
Get["/deletechat/{id}"] = parameters =>
{
string chatID = parameters.id;
var chats = JsonConvert.DeserializeObject<List<Channel>>(File.ReadAllText("chats.json"));
for(int i = 0; i < chats.Count; i++)
{
try
{
if (chats[i].ID == chatID)
chats.RemoveAt(i);
}
catch { }
}
File.WriteAllText("chats.json", JsonConvert.SerializeObject(chats, Formatting.Indented));
return Redirect("/chats");
};
Get["/chats"] = _ =>
{
return chatsListBuilder();
};
Get["/createchat"] = _ =>
{
return PageBuilder.Build("editchat", new Dictionary<string, string>
{
{"{body}", Properties.Resources.ChatEditTemplate },
{"{form}", SystemManager.BuildFormFromObject(new Channel()) }
});
};
Post["/createchat"] = parameters =>
{
var chat = this.Bind<Channel>();
chat.ID = chat.Name.ToLower().Replace(" ", "_");
List<Channel> chats = new List<Channel>();
if (File.Exists("chats.json"))
chats = JsonConvert.DeserializeObject<List<Channel>>(File.ReadAllText("chats.json"));
bool chatExists = false;
for (int i = 0; i < chats.Count; i++)
{
if (chats[i].ID == chat.ID)
{
chats[i] = chat;
chatExists = true;
}
}
if (!chatExists)
{
chats.Add(chat);
}
File.WriteAllText("chats.json", JsonConvert.SerializeObject(chats, Formatting.Indented));
return Redirect("/chats");
};
Get["/editchat/{id}"] = parameters =>
{
return PageBuilder.Build("editchat", new Dictionary<string, string>
{
{"{body}", Properties.Resources.ChatEditTemplate },
{"{form}", SystemManager.BuildFormFromObject(SystemManager.GetChat(parameters.id)) }
});
};
Post["/editchat/{id}"] = parameters =>
{
var chat = this.Bind<Channel>();
chat.ID = chat.Name.ToLower().Replace(" ", "_");
List<Channel> chats = new List<Channel>();
if (File.Exists("chats.json"))
chats = JsonConvert.DeserializeObject<List<Channel>>(File.ReadAllText("chats.json"));
bool chatExists = false;
for (int i = 0; i < chats.Count; i++)
{
if (chats[i].ID == chat.ID)
{
chats[i] = chat;
chatExists = true;
}
}
if (!chatExists)
{
chats.Add(chat);
}
File.WriteAllText("chats.json", JsonConvert.SerializeObject(chats, Formatting.Indented));
return Redirect("/chats");
};
Get["/poweron"] = _ =>
{
if (!SystemManager.MudIsRunning())
{
System.Diagnostics.Process.Start("ShiftOS.Server.exe");
}
return Redirect("/");
};
Get["/poweroff"] = _ =>
{
if (SystemManager.MudIsRunning())
{
SystemManager.KillMud();
}
return Redirect("/");
};
Get["/restart"] = _ =>
{
if (SystemManager.MudIsRunning())
{
SystemManager.KillMud();
}
return Redirect("/poweron");
};
}
private string statusBuilder()
{
return PageBuilder.Build("status", new Dictionary<string, string>{
{ "{cp_worth}", SystemManager.GetCPWorth() },
{ "{user_count}", SystemManager.GetUserCount() },
{ "{system_time}", DateTime.Now.ToString() },
});
}
private string chatsListBuilder()
{
return PageBuilder.Build("bla", new Dictionary<string, string>
{
{ "{body}", Properties.Resources.ChatListView },
{ "{chat_table}", SystemManager.GetAllChats() }
});
}
}
public class LoginRequest
{
public string username { get; set; }
public string password { get; set; }
}
}

View file

@ -1,60 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("ShiftOS.Server.WebAdmin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ShiftOS.Server.WebAdmin")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("b29fdd06-e6fe-40a2-8258-283728ced81a")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View file

@ -1,220 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ShiftOS.Server.WebAdmin.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ShiftOS.Server.WebAdmin.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to &lt;h3&gt;Create/edit chat&lt;/h3&gt;
///
///&lt;p&gt;Please fill out the details below for your channel list to be modified.&lt;/p&gt;
///
///{form}.
/// </summary>
internal static string ChatEditTemplate {
get {
return ResourceManager.GetString("ChatEditTemplate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;h3&gt;Chats&lt;/h3&gt;
///
///&lt;p&gt;On this page you can find a list of all chats in the system. Chats are a part of the multi-user domain that allows online players to talk to eachother in the &apos;MUD Chat&apos; application.&lt;/p&gt;
///
///&lt;p&gt;If you have a Discord server for your multi-user domain, you can also designate a ShiftOS chat to listen on a specific channel on your server. You will need to create a Discord Bot Token and specify the ID of the channel you want tolisten to.&lt;/p&gt;
///
///&lt;p&gt;Once the chat is set up, you should see a bot [rest of string was truncated]&quot;;.
/// </summary>
internal static string ChatListView {
get {
return ResourceManager.GetString("ChatListView", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;h3&gt;{listtitle}&lt;/h3&gt;
///
///&lt;p&gt;{listdesc}&lt;/p&gt;
///
///{list}.
/// </summary>
internal static string GenericTableList {
get {
return ResourceManager.GetString("GenericTableList", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;html&gt;
/// &lt;head&gt;
/// &lt;title&gt;Multi-user domain &amp;bull; ShiftOS&lt;/title&gt;
/// &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css&quot; integrity=&quot;sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u&quot; crossorigin=&quot;anonymous&quot;&gt;
///
/// &lt;link rel=&quot;stylesheet&quot; href=&quot;http://getshiftos.ml/css/theme.css&quot;/&gt;
///
/// &lt;!-- Latest compiled and minified JavaScript --&gt;
/// &lt;script src=&quot;https://code.jquery.com/jquery-3.1.1.js&quot; integrity=&quot;sha256-16cdPddA6VdVInumRGo6IbivbERE8p7C [rest of string was truncated]&quot;;.
/// </summary>
internal static string HtmlTemplate {
get {
return ResourceManager.GetString("HtmlTemplate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;h3&gt;Access denied.&lt;/h3&gt;
///
///&lt;p&gt;You require a higher authentication level to access this part of the multi-user domain. Please enter the username and password of whom has access to this sector.&lt;/p&gt;
///
///&lt;form method=&quot;post&quot; action=&quot;&quot;&gt;
/// &lt;table class=&quot;table&quot;&gt;
/// &lt;tr&gt;
/// &lt;td&gt;&lt;strong&gt;Username:&lt;/strong&gt;&lt;/td&gt;
/// &lt;td&gt;&lt;input class=&quot;form-control&quot; type=&quot;text&quot; name=&quot;username&quot;/&gt;&lt;/td&gt;
/// &lt;/tr&gt;
/// &lt;tr&gt;
/// &lt;td&gt;&lt;strong&gt;Password:&lt;/strong&gt;&lt;/td&gt;
/// &lt;td&gt;&lt;input class=&quot;form-control&quot; type=&quot;password&quot; name=&quot;password&quot;/&gt;&lt;/td&gt;
/// &lt;/tr [rest of string was truncated]&quot;;.
/// </summary>
internal static string LoginView {
get {
return ResourceManager.GetString("LoginView", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;h3&gt;No users found.&lt;/h3&gt;
///
///&lt;p&gt;Your multi-user domain is newly-created. Before you can use the admin panel, you must create a ShiftOS user to act as the administrator of the MUD.&lt;/p&gt;
///
///{user_create_form}.
/// </summary>
internal static string NoUsersFound {
get {
return ResourceManager.GetString("NoUsersFound", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;h1&gt;Initial setup&lt;/h1&gt;
///
///&lt;p&gt;This multi-user domain contains some users, however none of them are administrators. Please choose your user to make it an admin.&lt;/p&gt;
///
///{savelist}.
/// </summary>
internal static string SetupView {
get {
return ResourceManager.GetString("SetupView", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;h3&gt;System status&lt;/h3&gt;
///
///&lt;p&gt;Below is a summary of this multi-user domain&apos;s status.&lt;/p&gt;
///
///&lt;div class=&quot;row&quot;&gt;
/// &lt;div class=&quot;col-xs-6&quot;&gt;
/// &lt;h4&gt;MUD stats&lt;/h4&gt;
/// &lt;ul&gt;
/// &lt;li&gt;This server is worth &lt;strong&gt;{cp_worth}&lt;/strong&gt; Codepoints.&lt;/li&gt;
/// &lt;li&gt;This server has &lt;strong&gt;{user_count}&lt;/strong&gt; players registered.&lt;/li&gt;
/// &lt;/ul&gt;
/// &lt;/div&gt;
/// &lt;div class=&quot;col-xs-6&quot;&gt;
/// &lt;h4&gt;System environment&lt;/h4&gt;
/// &lt;ul&gt;
/// &lt;li&gt;&lt;strong&gt;Current system time:&lt;/strong&gt; {system_time}&lt;/li&gt;
/// &lt;/ul&gt;
/// &lt;/div&gt;
///&lt;/div&gt;.
/// </summary>
internal static string Status {
get {
return ResourceManager.GetString("Status", resourceCulture);
}
}
}
}

View file

@ -1,145 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="ChatEditTemplate" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ChatEditTemplate.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="ChatListView" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ChatListView.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="GenericTableList" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\GenericTableList.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="HtmlTemplate" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\HtmlTemplate.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="LoginView" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\LoginView.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="NoUsersFound" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\NoUsersFound.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="SetupView" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\SetupView.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="Status" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Status.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
</root>

View file

@ -1,5 +0,0 @@
<h3>Create/edit chat</h3>
<p>Please fill out the details below for your channel list to be modified.</p>
{form}

View file

@ -1,11 +0,0 @@
<h3>Chats</h3>
<p>On this page you can find a list of all chats in the system. Chats are a part of the multi-user domain that allows online players to talk to eachother in the 'MUD Chat' application.</p>
<p>If you have a Discord server for your multi-user domain, you can also designate a ShiftOS chat to listen on a specific channel on your server. You will need to create a Discord Bot Token and specify the ID of the channel you want tolisten to.</p>
<p>Once the chat is set up, you should see a bot join your Discord server. Once it does, any messages received by the server in that channel will be relayed into ShiftOS, and any messages received by the MUD in the ShiftOS channel will be relayed to Discord.</p>
<a href="/mudadmin/createchat" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Create chat</a>
{chat_table}

View file

@ -1,5 +0,0 @@
<h3>{listtitle}</h3>
<p>{listdesc}</p>
{list}

View file

@ -1,58 +0,0 @@
<html>
<head>
<title>Multi-user domain &bull; ShiftOS</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link rel="stylesheet" href="http://getshiftos.ml/css/theme.css"/>
<!-- Latest compiled and minified JavaScript -->
<script src="https://code.jquery.com/jquery-3.1.1.js" integrity="sha256-16cdPddA6VdVInumRGo6IbivbERE8p7CQR3HzTBuELA=" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<div class="navbar navbar-default">
<div class+"navbar-header">
<a class="navbar-brand" href="http://getshiftos.ml">ShiftOS</a>
</div>
<ul class="nav navbar-nav">
<li>
<a href="/mudadmin/status">System status</a>
</li>
<li>
<a href="/mudadmin/saves">Test subjects</a>
</li>
<li>
<a href="#">Shiftnet (NYI)</a>
</li>
<li>
<a href="#">Scripts (NYI)</a>
</li>
<li>
<a href="#">Legions (NYI)</a>
</li>
<li>
<a href="/mudadmin/chats">Chats</a>
</li>
<li>
<a href="#">Shops (NYI)</a>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
{mud_restart}
{mud_power}
{logout}
</ul>
</div>
<!-- /#sidebar-wrapper -->
<!-- Page Content -->
<div id="page-content-wrapper">
<div class="container-fluid content">
{body}
<p style="text-align:center;"><em>ShiftOS - MUD admin panel - Copyright &copy; 2017 ShiftOS developers</em></p>
</div>
</div>
</body>
</html>

View file

@ -1,31 +0,0 @@
<h3>Access denied.</h3>
<p>You require a higher authentication level to access this part of the multi-user domain. Please enter the username and password of whom has access to this sector.</p>
<form method="post" action="">
<table class="table">
<tr>
<td><strong>Username:</strong></td>
<td><input class="form-control" type="text" name="username"/></td>
</tr>
<tr>
<td><strong>Password:</strong></td>
<td><input class="form-control" type="password" name="password"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" class="btn btn-default"/></td>
</tr>
</table>
</form>
<div class="row">
<div class="col-xs-6">
<h4>What are my credentials?</h4>
<p>If you do not know your credentials, you are not a ShiftOS developer with write-access to the GitHub repository and authorized access to the multi-user domain's backend, so we ask that you get off this site and try to hack the MUD in-game. Thank you.</p>
</div>
<div class="col-xs-6">
<h4>I am a developer.</h4>
<p>Please contact Michael VanOverbeek if you are a developer and have not yet received your credentials.</p>
</div>
</div>

View file

@ -1,5 +0,0 @@
<h3>No users found.</h3>
<p>Your multi-user domain is newly-created. Before you can use the admin panel, you must create a ShiftOS user to act as the administrator of the MUD.</p>
{user_create_form}

View file

@ -1,5 +0,0 @@
<h1>Initial setup</h1>
<p>This multi-user domain contains some users, however none of them are administrators. Please choose your user to make it an admin.</p>
{savelist}

View file

@ -1,19 +0,0 @@
<h3>System status</h3>
<p>Below is a summary of this multi-user domain's status.</p>
<div class="row">
<div class="col-xs-6">
<h4>MUD stats</h4>
<ul>
<li>This server is worth <strong>{cp_worth}</strong> Codepoints.</li>
<li>This server has <strong>{user_count}</strong> players registered.</li>
</ul>
</div>
<div class="col-xs-6">
<h4>System environment</h4>
<ul>
<li><strong>Current system time:</strong> {system_time}</li>
</ul>
</div>
</div>

View file

@ -1,126 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{B29FDD06-E6FE-40A2-8258-283728CED81A}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ShiftOS.Server.WebAdmin</RootNamespace>
<AssemblyName>ShiftOS.Server.WebAdmin</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Nancy, Version=1.4.2.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nancy.1.4.3\lib\net40\Nancy.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Nancy.Authentication.Forms, Version=1.4.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nancy.Authentication.Forms.1.4.1\lib\net40\Nancy.Authentication.Forms.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Nancy.Authentication.Stateless, Version=1.4.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nancy.Authentication.Stateless.1.4.1\lib\net40\Nancy.Authentication.Stateless.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Nancy.Hosting.Self, Version=1.4.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Nancy.Hosting.Self.1.4.1\lib\net40\Nancy.Hosting.Self.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ShiftOS.Objects\ShiftOS.Objects.csproj">
<Project>{A069089A-8962-4607-B2B2-4CF4A371066E}</Project>
<Name>ShiftOS.Objects</Name>
</ProjectReference>
<ProjectReference Include="..\ShiftOS.Server\ShiftOS.Server.csproj">
<Project>{226c63b4-e60d-4949-b4e7-7a2ddbb96776}</Project>
<Name>ShiftOS.Server</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="Resources\HtmlTemplate.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\LoginView.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\SetupView.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Status.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\ChatListView.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\ChatEditTemplate.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\NoUsersFound.txt" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\GenericTableList.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Nancy" version="1.4.3" targetFramework="net452" />
<package id="Nancy.Authentication.Forms" version="1.4.1" targetFramework="net452" />
<package id="Nancy.Authentication.Stateless" version="1.4.1" targetFramework="net452" />
<package id="Nancy.Hosting.Self" version="1.4.1" targetFramework="net452" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
</packages>