Beispiel #1
0
        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 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 ();
				}
				
			}


		}
Beispiel #3
0
 static Task UserInterface(CommandContext commandContext)
 {
     var context = commandContext;
     while(true){
         var key = Console.ReadLine ();
         if (key.ToUpper () == "Q")
             context.Command = new Dictionary<string, string>{ { Constant.Cmd,Constant.CmdEnd} };
     }
 }
Beispiel #4
0
		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){
			}
			
		}