using Tesses.CMS.Client; using CommandLine; using System.Net; using Newtonsoft.Json; var prefs=Prefs.Create(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"tcms.json")); var res =Parser.Default.ParseArguments(args); res = await res.WithParsedAsync(MoviesCallback); res = await res.WithParsedAsync(ShowsCallback); res = await res.WithParsedAsync(UsersCallback); res = await res.WithParsedAsync(EndpointCallback); res = res.WithParsed(EventsCallback); void EventsCallback(EventsOptions options) { Console.WriteLine("About to read events"); using(var cms = new TessesCMSClient(prefs.Url)) { using(CancellationTokenSource src=new CancellationTokenSource()){ cms.StartEvents((evt)=>{ Console.WriteLine($"Type: {evt.Type}"); Console.WriteLine($"Username: {evt.Username}"); Console.WriteLine($"Userpropername: {evt.UserProperName}"); Console.WriteLine($"Name: {evt.Name}"); Console.WriteLine($"ProperName: {evt.ProperName}"); bool hasBody = !string.IsNullOrWhiteSpace(evt.Body); if(!string.IsNullOrWhiteSpace(evt.Description)) { Console.WriteLine("Description:"); Console.WriteLine(evt.Description); if(hasBody) Console.WriteLine(); } if(hasBody) { Console.WriteLine("Body:"); Console.WriteLine(evt.Body); } Console.WriteLine(); },src.Token); Console.ReadLine(); src.Cancel(); } } } async Task ShowsCallback(ShowsOptions options) { throw new NotImplementedException(); } async Task UsersCallback(UsersOptions options) { if(options.Login) { Console.Write("Email: "); string? email=Console.ReadLine(); if(string.IsNullOrWhiteSpace(email)) { Console.WriteLine("Email is empty"); return; } string password = ReadLine.ReadPassword($"Password for {email}: "); using(var clt = new TessesCMSClient(prefs.Url)) { var cookie = await clt.Users.GetCookieAsync(email,password); if(cookie.Success) { if(!string.IsNullOrWhiteSpace(prefs.Session)) { await clt.Users.SetCookieAsync(prefs.Session); await clt.Users.LogoutAsync(); } prefs.Session = cookie.Cookie; prefs.Save(); } } } else if(options.Logout) { if(string.IsNullOrWhiteSpace(prefs.Session)) { Console.WriteLine("Not logged in"); return; } using(var clt = new TessesCMSClient(prefs.Url)) { await clt.Users.SetCookieAsync(prefs.Session); await clt.Users.LogoutAsync(); prefs.Session=""; prefs.Save(); } Console.WriteLine("Logged out"); } else { using(var clt = new TessesCMSClient(prefs.Url)) { await foreach(var user in clt.Users.GetUsersAsync()) { Console.WriteLine($"Username: {user.Username}"); Console.WriteLine($"Name: {user.ProperName}"); Console.WriteLine("About:"); Console.WriteLine(user.AboutMe); Console.WriteLine(); } } } } async Task EndpointCallback(EndpointOptions options) { if(string.IsNullOrWhiteSpace(options.Url)) { Console.WriteLine($"Current Endpoint: {prefs.Url}"); } else { prefs.Url = options.Url; prefs.Save(); Console.WriteLine($"Set Current Endpoint To: {options.Url}"); } } async Task MoviesCallback(MoviesOptions options) { if(options.List) { using(var clt = new TessesCMSClient(prefs.Url)) { await foreach(var movie in clt.Movies.GetMoviesAsync(options.Username)) { Console.WriteLine($"Title (ProperName): {movie.ProperName}"); Console.WriteLine($"Name: {movie.Name}"); Console.WriteLine($"Created: {movie.CreationTime}"); Console.WriteLine($"Last Updated: {movie.LastUpdated}"); Console.WriteLine("Description: "); Console.WriteLine(movie.Description); Console.WriteLine(); } } } } [Verb("endpoint",false,new string[]{"ep"},HelpText ="Change endpoint")] internal class EndpointOptions { [Value(0,Required =false,HelpText = "Main Page URL for placing request")] public string Url {get;set;} = ""; } [Verb("users",false,HelpText = "User accounts")] internal class UsersOptions { [Option('l',"login",Required =false,HelpText = "Login")] public bool Login {get;set;}=false; [Option('o',"logout",Required = false,HelpText = "Logout")] public bool Logout {get;set;}=false; } internal class ShowsOptions { } [Verb("movies",false,HelpText ="The movies")] internal class MoviesOptions { [Option('l',"list",HelpText = "List movies")] public bool List {get;set;}=false; [Value(0,Required =true,HelpText = "Username")] public string Username {get;set;}=""; } internal class Prefs { [JsonProperty("url")] public string Url {get;set;}="https://tessesstudios.com/"; [JsonProperty("session")] public string Session {get;set;}=""; [JsonIgnore] string filename{get;set;}=""; public static Prefs Create(string path) { if(File.Exists(path)) { var res=JsonConvert.DeserializeObject(File.ReadAllText(path)) ?? new Prefs(); res.filename = path; return res; } else { return new Prefs(){filename=path}; } } public void Save() { File.WriteAllText(filename,JsonConvert.SerializeObject(this)); } } [Verb("events",false,new string[]{"evts"},HelpText ="Read server sent events (for debugging)")] internal class EventsOptions { }