chatr/ChatrServer/Program.Backup.cs

978 lines
36 KiB
C#

using System;
using System.IO;
using System.Diagnostics;
using System.Net;
using Newtonsoft.Json;
using Scriban;
using Tesses.WebServer;
using WebSocketSharp.Server;
using Chatr;
using System.Collections.Generic;
using System.Linq;
using Tesses.Chatr.Server;
using System.Threading;
using System.Threading.Tasks;
using System.Text;
public class ChatrApp
{
public static async Task Init(Arguments arguments,Func<string,string> getPath,IPEndPoint http,WebSocketServer wssv,Action wsInit=null)
{
using(var token = new CancellationTokenSource()){
Console.CancelKeyPress +=(sender,e)=>{token.Cancel();};
var template_index = Template.Parse(File.ReadAllText(getPath("index.html")));
var template_user = Template.Parse(File.ReadAllText(getPath("user/index.html")));
var template_qr = Template.Parse(File.ReadAllText(getPath("device-qr/index.html")));
RouteServer svr=new RouteServer();
/*svr.Add("/dem",async(e)=>{
var data= QRCoder.PngByteQRCodeHelper.GetQRCode("Demi Lovato",QRCoder.QRCodeGenerator.ECCLevel.Q,640);
await e.SendBytesAsync(data,"image/png");
});*/
svr.Add("/onetimeauth",async(e)=>{
string key;
if(e.QueryParams.TryGetFirst("key",out key))
{
await e.SendTextAsync($"<!doctype html><html><head><title>Login</title></head><body><form method=\"POST\" action=\"./onetimeauth\"><input type=\"submit\" value=\"Login\"><input type=\"hidden\" name=\"key\" value=\"{key}\"></form></body></html>");
}
});
svr.Add("/share",async(e)=>{
e.ParseBody();
StringBuilder b=new StringBuilder();
foreach(var queryParm in e.QueryParams)
{
foreach(var value in queryParm.Value)
{
b.AppendLine($"{queryParm.Key}: {value}");
}
}
await e.SendTextAsync(b.ToString(),"text/plain");
},"POST");
svr.Add("/onetimeauth",async(e)=>{
e.ParseBody();
string key;
if(e.QueryParams.TryGetFirst("key",out key))
{
string session;
if(UserManagement.GetAuthCode(key,out session))
{
e.ResponseHeaders.Add("Set-Cookie",$"{LoginResult.SessionCookieName}={session}; Path=/");
}
await e.SendRedirectAsync("/");
}
},"POST");
svr.Add("/api/appconfig.json",async(e)=>{
AppConfig config = new AppConfig(e,arguments);
await e.SendJsonAsync(config);
});
svr.Add("/api/email",async(e)=>{
try{
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
await e.SendTextAsync(res.Account.Email,"text/plain");
return;
}
}
}
}catch(Exception ex)
{
_=ex;
}
await e.SendTextAsync("[NO ACCOUNT]","text/plain");
});
svr.Add("/api/name",async(e)=>{
try{
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
await e.SendTextAsync(res.Account.Name,"text/plain");
return;
}
}
}
}catch(Exception ex)
{
_=ex;
}
await e.SendTextAsync("[NO ACCOUNT]","text/plain");
});
svr.Add("/api/login2",async(e)=>{
e.ParseBody();
string username;
string password;
if(e.QueryParams.TryGetFirst("username",out username))
{
if(e.QueryParams.TryGetFirst("password",out password))
{
var res=UserManagement.Login(username,password,true);
if(res.Success)
{
//Set-Cookie
//if(rememberMe)
//{
await e.SendTextAsync(res.SessionId,"text/plain");
Console.WriteLine("HI");
//}else{
// e.ResponseHeaders.Add("Set-Cookie",$"{LoginResult.SessionCookieName}={res.SessionId}; Path=/");
//}
//await e.SendRedirectAsync("/");
}else{
e.StatusCode=401;
await e.SendTextAsync("Unauthorized");
//await e.SendRedirectAsync("/err/incorrect-password.html");
//do what you do when You Have Wrong password
}
}
}
},"POST");
svr.Add("/api/botmsg",async(e)=>{
e.ParseBody();
//enforce bot permissions
e.StatusCode=400;
string msg_to;
if(!e.QueryParams.TryGetFirst("message_to",out msg_to)) msg_to="me";
string apiKey;
if(!e.QueryParams.TryGetFirst("ApiKey",out apiKey)) return;
string body;
if(!e.QueryParams.TryGetFirst("body",out body)) body="[No Body]";
string destbot;
if(!e.QueryParams.TryGetFirst("destbot",out destbot)) destbot="";
bool destIsBot=!string.IsNullOrWhiteSpace(destbot);
bool isToMe = msg_to == "me";
var key=UserManagement.AuthenticateApiKey(apiKey);
Func<Bot,string,bool> getIsNotMe=(b,msg_to_who)=>{
if(msg_to_who == "me") return false;
if(DataBase.Accounts ==null) return true;
var res=DataBase.Accounts.FindById(UserManagement.GetUserId(msg_to_who));
if(res == null) return true;
return res.Id != b.UserId;
};
if(key.Success && key.Bot != null)
{
if(!isToMe && getIsNotMe(key.Bot,msg_to) && key.Bot.Permissions.CanSendMessagesToOtherPeople) { await e.SendTextAsync("Access Denied: Can't Send To Another Person"); return;}
if(destIsBot && !key.Bot.Permissions.OthersCanReceiveMessages ) {await e.SendTextAsync("Access Denied: Can't send message to another bot"); return;}
Message msg=new Message();
msg.IsFromBot=true;
msg.IsToBot = destIsBot;
msg.SourceBotId = key.Bot.Id;
msg.SourceUserId = key.Bot.UserId;
msg.DestinationUserId = isToMe ? key.Bot.UserId : UserManagement.GetUserId(msg_to);
if(msg.DestinationUserId == -1)
{
await e.SendTextAsync("Unknown destination user");
return;
}
if(msg.IsToBot)
{
var res=UserManagement.GetBotId(msg.DestinationUserId,destbot);
if(res == -1)
{
await e.SendTextAsync("Unknown destination bot");
return;
}
msg.DestinationBotId=res;
}
msg.Content = body;
UserManagement.SendMessage(msg);
e.StatusCode=200;
await e.SendTextAsync("Success");
return;
}
await e.SendTextAsync("No Source Bot");
},"POST");
svr.Add("/api/msg",async(e)=>{
e.ParseBody();
string msg_to;
bool msg_to_me=true;
string redirect_to;
string body;
if(!e.QueryParams.TryGetFirst("body",out body)) body="[No Body]";
if(!e.QueryParams.TryGetFirst("redirect_to",out redirect_to)) redirect_to="/";
long dest_id=-1;
if(e.QueryParams.TryGetFirst("message_to",out msg_to)){
if(!string.IsNullOrWhiteSpace(msg_to))
{
dest_id=UserManagement.GetUserId(msg_to);
if(dest_id>-1)
{
msg_to_me=false;
}
}
}
//long dest_id =
/*<input type="hidden" name="message_to" value="{{ uname }}">
<input type="hidden" name="redirect_to" value="/user?name={{ uname }}">
<div class="mdl-textfield mdl-js-textfield">
<textarea class="mdl-textfield__input" type="text" rows= "6" id="sample5" name="body" ></textarea>
<label class="mdl-textfield__label" for="sample5">Message Body</label>
</div>*/
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
//from user
Message msg=new Message();
msg.IsFromBot=false;
msg.IsToBot=false;
msg.SourceUserId = res.Account.Id;
if(msg_to_me) msg.DestinationUserId=msg.SourceUserId; else msg.DestinationUserId=dest_id;
msg.Content=body;
UserManagement.SendMessage(msg);
await e.SendRedirectAsync(redirect_to);return;
}
}
}
if(!msg_to_me)
{
var account =UserManagement.GetAnonymous();
if(account != null && account.IsCorrectPassword("4209enabled")){
Message msg=new Message();
msg.IsFromBot=false;
msg.IsToBot=false;
msg.SourceUserId = account.Id; //
if(msg_to_me) msg.DestinationUserId=msg.SourceUserId; else msg.DestinationUserId=dest_id;
msg.Content=body;
UserManagement.SendMessage(msg);
}
}
await e.SendRedirectAsync(redirect_to);return;
},"POST"); //send msg from page
svr.Add("/api/logout",async(e)=>{
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null && res.Session != null)
{
string session_id=cookie[1];
UserManagement.Logout(session_id);
DateTime past=new DateTime(2018,7,24,14,55,00); //some bloke Overdoses on this date
e.ResponseHeaders.Add("Set-Cookie",$"{LoginResult.SessionCookieName}={session_id}; Path=/; Expires={past.ToString("R")}");
}
}
await e.SendRedirectAsync("/");
}
await e.SendRedirectAsync("/");
});
svr.Add("/apikey",async(e)=>{
//await e.SendRedirectAsync($"/apikey?name={bot.BotUserName}");
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
string username;
if(e.QueryParams.TryGetFirst("name",out username)){
Bot bot;
if(DataBase.Bots !=null && (bot=DataBase.Bots.FindOne(ee=>ee.UserId==res.Account.Id && ee.BotUserName==username))!=null)
{
string key= File.ReadAllText(getPath("apikey/index.html")).Replace("{API_KEY}",bot.ApiKey);
await e.SendTextAsync(key);
return;
}
}
}
}
}
await e.SendTextAsync("Unauthorized user or no bot with specified username");
});
svr.Add("/user",async(e)=>{
if(DataBase.Accounts ==null) {
await e.SendTextAsync("DataBase error: Accounts is null");
return;
}
Account account=null;
string username;
if(e.QueryParams.TryGetFirst("name",out username))
{
account=DataBase.Accounts.FindOne(ee=>ee.Username==username);
}
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
string accountName=res.Account.Name;
string accountUserName=res.Account.Username;
long accountUserId =res.Account.Id;
if(account == null)
{
account = res.Account;
}
object logged_in=new{
Name=WebUtility.HtmlEncode(accountName),
Url=$"./user?name={WebUtility.UrlEncode(accountUserName)}",
Notloggedin=false,
Loggedin=true,
Uname=account.Username,
Loggedinme=account.Id == res.Account.Id,
Loggedinnotme=account.Id != res.Account.Id,
Othername=WebUtility.HtmlEncode(account.Name),
Opt=UserManagement.GetUserOptions(account)
};
await e.SendTextAsync(template_user.Render(logged_in));
return;
}
}
}
if(account == null) {
await e.SendTextAsync("No Account");
return;
}
await e.SendTextAsync(template_user.Render(new{
Url="./login",
Name="Login",
Loggedinnotme=false,
Loggedinme=false,
Loggedin=false,
Notloggedin=true,
Uname=account.Username,
Othername=WebUtility.HtmlEncode(account.Name)
}));
//await e.SendFileAsync(getPath("user/index.html"));
});
svr.Add("/api/create-bot",async(e)=>{
string cookie_txt;
e.ParseBody();
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
string botname;
string botuser;
string botdesc;
if(e.QueryParams.TryGetFirst("botname",out botname))
{
if(e.QueryParams.TryGetFirst("botuser",out botuser))
{
if(e.QueryParams.TryGetFirst("botdesc",out botdesc))
{
if(DataBase.Bots != null && Account.IsValidName(botname) && Account.IsValidUserName(botuser) && Account.IsValidName(botdesc)){
var bot= DataBase.Bots.FindOne(ee=>ee.BotUserName == botuser && res.Account.Id == ee.UserId);
if(bot == null)
{
Bot b=new Bot();
b.UserId= res.Account.Id;
b.BotUserName=botuser;
b.BotDescription=botdesc;
b.BotName = botname;
b.ApiKey = Account.GetNewSalt();
b.Permissions.SetPermissionsFromForm(e);
DataBase.Bots.Insert(b);
await e.SendRedirectAsync($"/apikey?name={b.BotUserName}");
return;
}else{
bot.Permissions.SetPermissionsFromForm(e);
DataBase.Bots.Update(bot);
await e.SendRedirectAsync($"/apikey?name={bot.BotUserName}");
return;
}
}
}
}
}
}
}
}
},"POST");
svr.Add("/create-bot-permissions",async(e)=>{
string cookie_txt;
e.ParseBody();
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
//get botname botuser botdesc
string botname;
string botuser;
string botdesc;
if(e.QueryParams.TryGetFirst("botname",out botname))
{
if(e.QueryParams.TryGetFirst("botuser",out botuser))
{
if(e.QueryParams.TryGetFirst("botdesc",out botdesc))
{
if(DataBase.Bots != null){
var bot= DataBase.Bots.FindOne(ee=>ee.BotUserName == botuser && res.Account.Id == ee.UserId);
if(bot == null && Account.IsValidName(botname) && Account.IsValidUserName(botuser) && Account.IsValidName(botdesc))
{
string page0=File.ReadAllText(getPath("create-bot-permissions/index.html")).Replace("{BOT_DESC}",botdesc).Replace("{BOT_USER}",botuser).Replace("{BOT_NAME}",botname);
await e.SendTextAsync(page0);
return;
}
}
}
}
}
}
}
}
await e.SendTextAsync("Either your not logged in or post error");
},"POST");
svr.Add("/create-bot",async(e)=>{
await e.SendFileAsync(getPath("create-bot/index.html"));
});
svr.Add("/api/user-setting",async(e)=>{
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
await e.SendJsonAsync(UserManagement.GetUserOptions(res.Account));
}
}
}
});
svr.Add("/api/user-setting",async(e)=>{
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
var opt=UserManagement.GetUserOptions(res.Account);
UserManagement.SetUserOptions(opt,e);
await e.SendRedirectAsync($"/user?name={res.Account.Username}");
}
}
}
},"POST");
svr.Add("/",async(e)=>{
try{
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
var mymsg=new List<MyMessage>();
foreach(var msg in UserManagement.GetMessages(res.Account,null,null))
{
var msg0=new MyMessage();
msg0.Time=msg.CreationTime.ToString("R");
msg0.Body = WebUtility.HtmlEncode(msg.Content);
msg0.Mine=true;
mymsg.Add(msg0);
}
var users = new List<UserAccount>();
foreach(var bot in UserManagement.GetMyBots(res.Account))
{
var usr=new UserAccount();
usr.Hash = $"me-{bot.BotUserName}";
usr.Text = WebUtility.HtmlEncode($"{bot.BotName} (My Bot)");
foreach(var msg in UserManagement.GetMessages(res.Account,null,bot.BotUserName))
{
var msg0 =new MyMessage();
msg0.Time=msg.CreationTime.ToString("R");
msg0.Mine = msg.IsToBot;
msg0.Body = WebUtility.HtmlEncode(msg.Content);
usr.Messages.Add(msg0);
}
users.Add(usr);
}
foreach(var otherUser in UserManagement.GetUserWithMe(res.Account))
{
var usr=new UserAccount();
usr.Hash = otherUser.Username;
usr.Text = WebUtility.HtmlEncode(otherUser.Name);
foreach(var msg in UserManagement.GetMessages(res.Account,otherUser.Username))
{
var msg0=new MyMessage();
msg0.Time=msg.CreationTime.ToString("R");
msg0.Mine = msg.SourceUserId == res.Account.Id;
msg0.Body = WebUtility.HtmlEncode(msg.Content);
usr.Messages.Add(msg0);
}
users.Add(usr);
foreach(var bot in UserManagement.GetBotsWithMe(res.Account,otherUser))
{
var usr0 = new UserAccount();
usr0.Hash = $"{otherUser.Username}-{bot.BotUserName}";
usr0.Text = WebUtility.HtmlDecode($"{bot.BotName} ({otherUser.Name}'s Bot)");
foreach(var msg in UserManagement.GetMessages(res.Account,otherUser.Username,bot.BotUserName))
{
var msg0=new MyMessage();
msg0.Time=msg.CreationTime.ToString("R");
msg0.Mine = msg.SourceUserId == res.Account.Id;
msg0.Body = WebUtility.HtmlEncode(msg.Content);
usr0.Messages.Add(msg0);
}
users.Add(usr0);
}
}
string accountName=res.Account.Name;
string accountUserName =res.Account.Username;
object logged_in=new{
Name=WebUtility.HtmlEncode(accountName),
Url=$"./user?name={accountUserName}",
Loggedin=true,
Mymessages=mymsg,
Users=users
};
await e.SendTextAsync(template_index.Render(logged_in));
return;
}
}
}
}catch (Exception ex){
Console.WriteLine(ex);
}
await e.SendTextAsync(template_index.Render(new{
Url="./login",
Name="Login",
Loggedin=false
}));
});
svr.Add("/api/new-ota.txt",async(e)=>{
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
DateTime expire=DateTime.Now.AddYears(1);
if(e.QueryParams.TryGetFirst("expires",out cookie_txt))
{
long exp;
if(long.TryParse(cookie_txt,out exp))
{
expire=DateTimeOffset.FromUnixTimeSeconds(exp).DateTime;
}
}
string session=UserManagement.CreateAnotherSession(cookie[1],expire);
if(!string.IsNullOrWhiteSpace(session))
{
await e.SendTextAsync(UserManagement.CreateOTA(session),"text/plain");return;
}
//
}
}
}
e.StatusCode=401;
await e.WriteHeadersAsync();
});
svr.Add("/device-qr",async(e)=>{
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
string accountName=res.Account.Name;
string accountUserName =res.Account.Username;
//string? session=UserManagement.CreateAnotherSession(cookie[1],DateTime.Now.AddYears(1));
/*
Console.WriteLine($"{e.Host}#{session}");
*/
object logged_in=new{
Name=WebUtility.HtmlEncode(accountName),
Url=$"./user?name={WebUtility.UrlEncode(accountUserName)}",
Loggedin=true,
};
await e.SendTextAsync(template_qr.Render(logged_in));
return;
}
}
}
await e.SendTextAsync(template_qr.Render(new{
Url="./login",
Name="Login",
Loggedin=false
}));
});
svr.Add("/api/state.json",async(e)=>{
try{
string cookie_txt;
if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt))
{
string[] cookie=cookie_txt.Split(new char[]{'='},2);
if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1]))
{
var res=UserManagement.Authenticate(cookie[1]);
if(res.Success && res.Account != null)
{
var mymsg=new List<MyMessage>();
foreach(var msg in UserManagement.GetMessages(res.Account,null,null))
{
var msg0=new MyMessage();
msg0.Body = WebUtility.HtmlEncode(msg.Content);
msg0.Mine=true;
msg0.Time=msg.CreationTime.ToString("R");
mymsg.Add(msg0);
}
var users = new List<UserAccount>();
foreach(var bot in UserManagement.GetMyBots(res.Account))
{
var usr=new UserAccount();
usr.Hash = $"me-{bot.BotUserName}";
usr.Text = WebUtility.HtmlEncode($"{bot.BotName} (My Bot)");
foreach(var msg in UserManagement.GetMessages(res.Account,null,bot.BotUserName))
{
var msg0 =new MyMessage();
msg0.Mine = msg.IsToBot;
msg0.Body = WebUtility.HtmlEncode(msg.Content);
msg0.Time=msg.CreationTime.ToString("R");
usr.Messages.Add(msg0);
}
users.Add(usr);
}
foreach(var otherUser in UserManagement.GetUserWithMe(res.Account))
{
var usr=new UserAccount();
usr.Hash = otherUser.Username;
usr.Text = WebUtility.HtmlEncode(otherUser.Name);
foreach(var msg in UserManagement.GetMessages(res.Account,otherUser.Username))
{
var msg0=new MyMessage();
msg0.Mine = msg.SourceUserId == res.Account.Id;
msg0.Body = WebUtility.HtmlEncode(msg.Content);
msg0.Time=msg.CreationTime.ToString("R");
usr.Messages.Add(msg0);
}
users.Add(usr);
foreach(var bot in UserManagement.GetBotsWithMe(res.Account,otherUser))
{
var usr0 = new UserAccount();
usr0.Hash = $"{otherUser.Username}-{bot.BotUserName}";
usr0.Text = WebUtility.HtmlDecode($"{bot.BotName} ({otherUser.Name}'s Bot)");
foreach(var msg in UserManagement.GetMessages(res.Account,otherUser.Username,bot.BotUserName))
{
var msg0=new MyMessage();
msg0.Mine = msg.SourceUserId == res.Account.Id;
msg0.Body = WebUtility.HtmlEncode(msg.Content);
msg0.Time=msg.CreationTime.ToString("R");
usr0.Messages.Add(msg0);
}
users.Add(usr0);
}
}
string accountName=res.Account.Name;
string accountUserName =res.Account.Username;
object logged_in=new{
Email=res.Account.Email,
Name=accountName,
Url=$"/user?name={accountUserName}",
Loggedin=true,
Mymessages=mymsg,
Users=users
};
Console.WriteLine("Alternate HI");
await e.SendJsonAsync(logged_in);
Console.WriteLine("SENT");
return;
}
}
}
}catch (Exception ex){
_=ex;
}
await e.SendJsonAsync(new{
Loggedin=false
});
},"GET");
svr.Add($"/login",async(e)=>{
await e.SendFileAsync(getPath("login/index.html"));
});
svr.Add($"/signup",async(e)=>{
await e.SendFileAsync(getPath("signup/index.html"));
});
Action<string> set_url=(e2)=>{
svr.Add($"/{e2}",async(e)=>{
await e.SendFileAsync(getPath(e2));
});
};
foreach(var f in File.ReadAllLines(getPath("files.txt")))
{
set_url(f);
}
svr.Add("/api/login",async(e)=>{
e.ParseBody();
string username;
string password;
string rememberMeStr;
bool rememberMe;
if(e.QueryParams.TryGetFirst("username",out username))
{
if(e.QueryParams.TryGetFirst("password",out password))
{
rememberMe=(e.QueryParams.TryGetFirst("remember",out rememberMeStr) && rememberMeStr == "on");
var res=UserManagement.Login(username,password,rememberMe);
if(res.Success)
{
//Set-Cookie
if(rememberMe)
{
e.ResponseHeaders.Add("Set-Cookie",$"{LoginResult.SessionCookieName}={res.SessionId}; Path=/; Expires={res.Expires.ToString("R")}");
}else{
e.ResponseHeaders.Add("Set-Cookie",$"{LoginResult.SessionCookieName}={res.SessionId}; Path=/");
}
await e.SendRedirectAsync("/");
}else{
await e.SendRedirectAsync("/err/incorrect-password.html");
//do what you do when You Have Wrong password
}
}
}
},"POST");
svr.Add("/api/signup",async(e)=>{
e.ParseBody();
string email;
string name;
string username;
string password;
string confirm;
if(e.QueryParams.TryGetFirst("email",out email))
{
if(e.QueryParams.TryGetFirst("name",out name))
{
if(e.QueryParams.TryGetFirst("uname",out username))
{
if(e.QueryParams.TryGetFirst("password",out password))
{
if(e.QueryParams.TryGetFirst("password2",out confirm))
{
if(!string.IsNullOrWhiteSpace(name) && !string.IsNullOrWhiteSpace(username) && !string.IsNullOrWhiteSpace(password) && !string.IsNullOrWhiteSpace(confirm))
{
RegistrationResult result=UserManagement.RegisterAccount(name,username,email,password);
if(result.Success)
{
await e.SendRedirectAsync("/");
return;
}else{
object o=new{
success=false,
error=result.Error
};
e.StatusCode=400;
await e.SendJsonAsync(o);
return;
}
}
}
}
}
}
}
e.StatusCode=400;
object op=new{
success=false,
error="Information not filled out"
};
await e.SendJsonAsync(op);
},"POST");
MountableServer _mountable=new MountableServer(svr);
HttpServerListener listener=new HttpServerListener(http,_mountable);
Timer t=new Timer((e)=>{
try{
DateTime d=DateTime.Now;
List<long> items=new List<long>();
if(DataBase.Sessions != null){
foreach(var s in DataBase.Sessions.FindAll())
{
if(s.Expires < d)
{
items.Add(s.Id);
}
}
foreach(var item in items){
DataBase.Sessions.Delete(item);
}
}
}catch(Exception ex)
{
_=ex;
}
},null,0,600000);
wssv.AddWebSocketService<WSConnection>("/chatr-ws");
wssv.Start();
if(wsInit != null)
{
wsInit();
}
await listener.ListenAsync(token.Token);
wssv.Stop();
}
}
}