public static async Task StreamStart(CommandContext C,StatusContext S){ var IDs = GetIdFromXml (); if (IDs == null) { Console.WriteLine ("Xml dose not parse. Close."); C.Command = new Dictionary<string,string> (){ { Constant.Cmd,Constant.CmdEnd } }; return; } bool RetryFlag = false; var context = C.GetCommand; var StatusContext = S.GetStatus; var Token = TokenCreate (IDs); C.Command = new Dictionary<string,string> (){ { Constant.Cmd,Constant.CmdStart } }; var botstatus = Token.Users.Show (Constant.hinayakuUserId); var stats = new BotStatus () { Name = botstatus.Name, Location = botstatus.Location, Description = botstatus.Description, Url = botstatus.Url }; try{ var latesthinayaku = Token.Statuses.UserTimeline(Constant.hinayakuUserId,10); Console.WriteLine(latesthinayaku.First().Text); await Token.Statuses.UpdateAsync(".@hinayaku おはようひなやく",latesthinayaku.First().Id); } catch(Exception ex){ Console.WriteLine (ex.Message); } while(true){ try{ RetryFlag = false; // var stream = Token.Streaming.UserAsObservable () // .Timeout (TimeSpan.FromSeconds (30)) // .Retry (5) // .Catch((Exception e) => { // Console.WriteLine(e.Message); // if(e.StackTrace != null) Console.WriteLine(e.StackTrace); // return Observable.Never<StatusMessage>(); // }) // .Publish (); // // stream // .OfType<StatusMessage>() // .Where (x => !x.Status.User.ScreenName.Contains (@"hinayakuBot")) // .Select (x => new TwString{Name = x.Status.User.ScreenName, Text = x.Status.Text, Id = x.Status.Id}) // .Subscribe (x => Console.WriteLine(x.Text)); // stream // .Where (x => !(x.Status.IsRetweeted.HasValue && x.Status.IsRetweeted.Value)) // .Select (x => new TwString{Name = x.Status.User.ScreenName, Text = x.Status.Text, Id = x.Status.Id}) // .Subscribe (x => StatusContext.OnNext(x)); var ApiLimit = await Token.Application.RateLimitStatusAsync (); foreach(var rateLimit in ApiLimit["statuses"]) { Console.WriteLine("{0}: {1} {2}", rateLimit.Key, rateLimit.Value.Remaining, rateLimit.Value.Limit); Console.WriteLine("---------"); } context .Where (x => x.Keys.Any (y => y == Constant.Cmd)) .Subscribe (async x => { if(x[Constant.Cmd] == Constant.CmdReBorn)RetryFlag = true; else if(x[Constant.Cmd] == Constant.CmdEnd){ //C.Command = new Dictionary<string, string>(){{Constant.Cmd,Constant.CmdAck}}; await SayonaraHinayakuAsync(Token); return; } else if(x[Constant.Cmd] == Constant.CmdSuicide){ await Token.Statuses.UpdateAsync($"Stop By @{x[Constant.TwName]}",long.Parse(x[Constant.TwId])); } else if(x[Constant.Cmd] == Constant.CmdTweet){ await Token.Statuses.UpdateAsync(x[Constant.TwText],long.Parse(x[Constant.TwId])); } }); while(RetryFlag != true){ await Task.Delay (TimeSpan.FromSeconds (1)); } }catch(Exception ex){ ex.Message.COut (); } } }
static void Main(string[] args) { "Wake up, HinayakuBot!".COut (); bool ShutDownFlag = false; List<Task> Tasks = new List<Task> (); var CommandContext = new CommandContext (); var StatusContext = new StatusContext (); var cts = new System.Threading.CancellationTokenSource (); Tasks.Add(Task.Run(() => StreamObservable.StreamStart(CommandContext,StatusContext),cts.Token)); Tasks.Add(Task.Run (() => AILogic.AI (CommandContext,StatusContext),cts.Token)); Tasks.Add (Task.Run (() => UserInterface (CommandContext),cts.Token)); System.Threading.Thread.Yield (); Task.WhenAll (Tasks).ContinueWith (x => ShutDownFlag = true); CommandContext.GetCommand.Subscribe (x => { if(x.Keys.Any(y => y == Constant.Cmd)) x[Constant.Cmd].COut(); else if(x.Keys.Any(y => y == Constant.Cmd)&& x[Constant.Cmd] == Constant.CmdEnd) ShutDownFlag = true ; }); var IDs = GetIdFromXml (); var Token = TokenCreate (IDs); var stream = Token.Streaming.UserAsObservable() .Timeout (TimeSpan.FromSeconds (30)) .Retry (5) .Catch((Exception e) => { Console.WriteLine(e.Message); if(e.StackTrace != null) Console.WriteLine(e.StackTrace); return Observable.Never<StatusMessage>(); }) .Publish (); stream .OfType<StatusMessage>() .Where (x => !x.Status.User.ScreenName.Contains (@"hinayakuBot")) .Select (x => new TwString{Name = x.Status.User.ScreenName, Text = x.Status.Text, Id = x.Status.Id}) .Subscribe (x => Console.WriteLine(x.Text)); while(true){ if (ShutDownFlag == true){ Task.Delay (TimeSpan.FromSeconds (15)).Wait (); cts.Cancel (); break; } } "All Done".COut (); }
public static async Task AI(CommandContext C, StatusContext S){ var stream = S.GetStatus.Publish(); var context = C.GetCommand; stream .Where(y => y.Text.Contains("Yo") && y.Text.Contains("hinayakuBot")) .Select(x => new{Text = x.Text,Id = x.Id, Name = x.Name}) .Subscribe(x => { var dict = new Dictionary<string,string>() { {Constant.TwText,"@{x.Name} Yo"}, {Constant.TwId,x.Id.ToString()} }; context.OnNext(dict); }, z => { Console.WriteLine(z.Message); }, () => { Console.WriteLine(DateTime.Now + " : これはOnComplete at Yo"); }); stream .Subscribe(x => { Console.WriteLine(x.Name + "¥n" + x.Text + "¥n"); }, (Exception y) => Console.WriteLine(y.Message), () => { Console.WriteLine(DateTime.Now + " : これはOnComplete at Stream"); }); stream .Where (x => x.Text.Contains ("天気") || x.Text.Contains ("気温") || x.Text.Contains ("温度") || x.Text.Contains ("予報")) .Subscribe(x => WeatherTweet.WeatherHinayakuAsync(x) .ContinueWith(y => context.OnNext(y.Result)) ,z => { Console.WriteLine(z.Message); }, () => { Console.WriteLine("これはOnComplete at tenki"); }); stream.OfType<Error> () .Subscribe (x => Console.WriteLine(x.Message),z => Console.WriteLine(z.Message)); while(true){ } }