Add basic commands for birthday greet
This commit is contained in:
		
							parent
							
								
									6885d6b6b9
								
							
						
					
					
						commit
						cf4ab2a15c
					
				
							
								
								
									
										
											BIN
										
									
								
								DiscoBot/615631052047908870-bdaygreet.db
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								DiscoBot/615631052047908870-bdaygreet.db
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								DiscoBot/98293701175955456-bdaygreet.db
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								DiscoBot/98293701175955456-bdaygreet.db
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										206
									
								
								DiscoBot/bdaygreet/BDayGreet.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								DiscoBot/bdaygreet/BDayGreet.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,206 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Globalization; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Net.WebSockets; | ||||||
|  | using System.ServiceModel.Syndication; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using System.Timers; | ||||||
|  | using System.Xml; | ||||||
|  | using Discord; | ||||||
|  | using Discord.WebSocket; | ||||||
|  | 
 | ||||||
|  | namespace DiscoBot.bdaygreet | ||||||
|  | { | ||||||
|  |     public class BDayGreet : IModule | ||||||
|  |     { | ||||||
|  |         string IModule.Name { get => "BDayGreet"; set => throw new NotImplementedException(); } | ||||||
|  |         private SocketGuild guild; | ||||||
|  |         private BDayGreetContext bdayGreetContext; | ||||||
|  |         private Dictionary<string, Timer> timers = new Dictionary<string, Timer>(); | ||||||
|  |         private List<WebSocket> webSockets = new List<WebSocket>(); | ||||||
|  | 
 | ||||||
|  |         public Dictionary<string, Func<SocketMessage, string[], Task>> Commands { get; set; } = new Dictionary<string, Func<SocketMessage, string[], Task>>(); | ||||||
|  | 
 | ||||||
|  |         public BDayGreet(SocketGuild guild) | ||||||
|  |         { | ||||||
|  |             this.guild = guild; | ||||||
|  |             bdayGreetContext = new BDayGreetContext(guild.Id); | ||||||
|  |             bdayGreetContext.Database.EnsureCreated(); | ||||||
|  |             foreach(var f in bdayGreetContext.BDays) | ||||||
|  |             { | ||||||
|  |                 //InitializeFeed(f); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             Commands.Add("bdayadd", HandleBDayAddCommand); | ||||||
|  |             Commands.Add("bdaydel", HandleBDayDelCommand); | ||||||
|  |             Commands.Add("bdaylist", HandleBDayListCommand); | ||||||
|  |             Commands.Add("bdaydebug", HandleBDayDebugCommand); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /* | ||||||
|  |         private Task InitializeFeed(BDayUser feed) | ||||||
|  |         { | ||||||
|  |             Console.WriteLine("Found feed " + feed.Name); | ||||||
|  |              | ||||||
|  |             Timer timer = new Timer(feed.CheckInterval.TotalMilliseconds); | ||||||
|  |             timer.AutoReset = true; | ||||||
|  |             timer.Elapsed += async (sender, e) => | ||||||
|  |             { | ||||||
|  |                 await Task.Run(() => HandleBDayCheck(feed)); | ||||||
|  |             }; | ||||||
|  |             timer.Start(); | ||||||
|  |             timers.Add(feed.Name, timer); | ||||||
|  | 
 | ||||||
|  |             HandleBDayCheck(feed); | ||||||
|  |             return Task.CompletedTask; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private Task DeinitializeFeed(BDayFeed feed) | ||||||
|  |         { | ||||||
|  |             Timer t = timers[feed.Name]; | ||||||
|  |             t.Stop(); | ||||||
|  |             timers.Remove(feed.Name); | ||||||
|  |             return Task.CompletedTask; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private Task HandleBDayCheck(BDayFeed feed) | ||||||
|  |         { | ||||||
|  |             SocketTextChannel c = guild.Channels.Where(g => g.Id == feed.Channel).Single() as SocketTextChannel; | ||||||
|  |             c.SendMessageAsync("Yes yes i will check."); | ||||||
|  |              | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 XmlReader reader = XmlReader.Create(feed.Url); | ||||||
|  |                 SyndicationFeed f = SyndicationFeed.Load(reader); | ||||||
|  |                 DateTimeOffset newestItem = feed.LastChecked; | ||||||
|  |                 foreach(var item in f.Items) | ||||||
|  |                 { | ||||||
|  |                     if (item.LastUpdatedTime <= feed.LastChecked) | ||||||
|  |                         continue; | ||||||
|  |                     Console.WriteLine("{0}: {1} | {2}", feed.Name, item.LastUpdatedTime, feed.LastChecked); | ||||||
|  |                     List<string> m = new List<string>(); | ||||||
|  |                     m.Add("<" + feed.Name + "> " + item.Title.Text); | ||||||
|  |                     if(item.LastUpdatedTime > newestItem) | ||||||
|  |                     { | ||||||
|  |                         Console.WriteLine("^-- UPDATE!"); | ||||||
|  |                         newestItem = item.LastUpdatedTime; | ||||||
|  |                     } | ||||||
|  |                     foreach (var l in item.Links) | ||||||
|  |                     { | ||||||
|  |                         m.Add(l.Uri.ToString()); | ||||||
|  |                     } | ||||||
|  |                     c.SendMessageAsync(string.Join(" | ", m)); | ||||||
|  |                 } | ||||||
|  |                 feed.LastChecked = newestItem; | ||||||
|  |                 rssContext.SaveChangesAsync(); | ||||||
|  |             } catch(System.Net.WebException e) | ||||||
|  |             { | ||||||
|  |                 c.SendMessageAsync("<" + feed.Name + "> " + "NetworkFailure: " + e.Message); | ||||||
|  |             } catch(XmlException e) | ||||||
|  |             { | ||||||
|  |                 c.SendMessageAsync("<" + feed.Name + "> " + "Malformed Response: " + e.Message); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             return Task.CompletedTask; | ||||||
|  |         } | ||||||
|  |         */ | ||||||
|  | 
 | ||||||
|  |         private async Task HandleBDayAddCommand(SocketMessage msg, string[] parameters) | ||||||
|  |         { | ||||||
|  |             var gauthor = guild.Users.Where(u => u.Id == msg.Author.Id).Single(); | ||||||
|  |             if(!gauthor.GuildPermissions.Administrator) | ||||||
|  |             { | ||||||
|  |                 await msg.Channel.SendMessageAsync("Sorry only administrators can add birthdays :("); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             var gchan = msg.Channel as IGuildChannel; | ||||||
|  |             string name = parameters[1]; | ||||||
|  |             string date = parameters[2]; | ||||||
|  | 
 | ||||||
|  |             SocketGuildUser user; | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 user = guild.Users.Where(u => u.Mention == name).Single(); | ||||||
|  |             } | ||||||
|  |             catch (InvalidOperationException) | ||||||
|  |             { | ||||||
|  |                 await msg.Channel.SendMessageAsync("I can't find user " + name + " so I can't add them."); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             DateTimeOffset d; | ||||||
|  |             try { | ||||||
|  |                 d = DateTimeOffset.Parse(date, null, DateTimeStyles.AssumeUniversal); | ||||||
|  |             } catch(FormatException) { | ||||||
|  |                 await msg.Channel.SendMessageAsync("Sorry I can't parse your date. Please try again!"); | ||||||
|  |                 return; | ||||||
|  |             }  | ||||||
|  |             await msg.Channel.SendMessageAsync("Add " + name + " on " + d); | ||||||
|  |              | ||||||
|  |             var bday = new BDayUser(); | ||||||
|  |             bday.DiscordTag = user.Username + "#" + user.DiscriminatorValue; | ||||||
|  |             bday.Channel = msg.Channel.Id; | ||||||
|  |             bday.BirthDate = d; | ||||||
|  |             bday.LastGreet = d.AddYears(-1); | ||||||
|  |             bdayGreetContext.Add(bday); | ||||||
|  |             bdayGreetContext.SaveChanges(); | ||||||
|  |             await msg.Channel.SendMessageAsync("I remembered that " + name + "'s next birthday "); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private async Task HandleBDayListCommand(SocketMessage msg, string[] parameters) | ||||||
|  |         { | ||||||
|  |             var bdays = bdayGreetContext.BDays.Where(b => b.Channel == msg.Channel.Id).ToList(); | ||||||
|  |             List<string> m = new List<string>(); | ||||||
|  |             m.Add("I am tracking birthdays for: "); | ||||||
|  |             int cnt = 0; | ||||||
|  |             string str = ""; | ||||||
|  |             foreach(var bday in bdays) | ||||||
|  |             { | ||||||
|  |                 str += bday.DiscordTag + " "; | ||||||
|  |                 cnt++; | ||||||
|  |                 if(cnt > 4) | ||||||
|  |                 { | ||||||
|  |                     m.Add(str); | ||||||
|  |                     str = ""; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             m.Add(str); | ||||||
|  |             await msg.Channel.SendMessageAsync(string.Join("\n",m)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private async Task HandleBDayDelCommand(SocketMessage msg, string[] parameters) | ||||||
|  |         { | ||||||
|  |             var gchan = msg.Channel as IGuildChannel; | ||||||
|  |             string tag = parameters[1]; | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 var b = bdayGreetContext.BDays.Where(b => b.DiscordTag == tag).Single(); | ||||||
|  |                 bdayGreetContext.Remove(b); | ||||||
|  |                 bdayGreetContext.SaveChanges(); | ||||||
|  |                 await msg.Channel.SendMessageAsync("Removed birthday " + b.DiscordTag); | ||||||
|  |             } catch(InvalidOperationException) | ||||||
|  |             { | ||||||
|  |                 await msg.Channel.SendMessageAsync("Could not find " + tag+"'s birthday. Add it!"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private Task HandleBDayDebugCommand(SocketMessage msg, string[] parameters) | ||||||
|  |         { | ||||||
|  |             Console.WriteLine("Handling test command!"); | ||||||
|  |             string para = string.Join(",", parameters); | ||||||
|  |             msg.Channel.SendMessageAsync("Test succeeded. Params: "+para); | ||||||
|  |             return Task.CompletedTask; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public void Initialize() | ||||||
|  |         { | ||||||
|  |             Console.WriteLine("Initializing bdaygreet..."); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public async Task OnNewWebSocketAsync(WebSocket ws, TaskCompletionSource<object> tcs) | ||||||
|  |         { | ||||||
|  |             Console.WriteLine("Calendar " + guild.Id + " has a new websocket."); | ||||||
|  |             webSockets.Add(ws); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										35
									
								
								DiscoBot/bdaygreet/BDayGreetContext.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								DiscoBot/bdaygreet/BDayGreetContext.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | using Microsoft.EntityFrameworkCore; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.ComponentModel.DataAnnotations; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | 
 | ||||||
|  | namespace DiscoBot.bdaygreet | ||||||
|  | { | ||||||
|  |     public class BDayGreetContext : DbContext | ||||||
|  |     { | ||||||
|  |         private ulong guildId; | ||||||
|  |         public DbSet<BDayUser> BDays { get; set; } | ||||||
|  | 
 | ||||||
|  |         public BDayGreetContext(ulong guildId) | ||||||
|  |         { | ||||||
|  |             this.guildId = guildId; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) | ||||||
|  |         { | ||||||
|  |             optionsBuilder.UseSqlite("Data Source=" + guildId + "-bdaygreet.db"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public class BDayUser | ||||||
|  |     { | ||||||
|  |         [Key] | ||||||
|  |         public string DiscordTag { get; set; } | ||||||
|  |         public DateTimeOffset BirthDate { get; set; } | ||||||
|  |         public ulong Channel { get; set; } | ||||||
|  |         public DateTimeOffset LastGreet { get; set; } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -63,7 +63,7 @@ namespace DiscoBot.gsmeet | |||||||
|                     t.Elapsed += async (sender, e) => |                     t.Elapsed += async (sender, e) => | ||||||
|                     { |                     { | ||||||
|                         foreach(var user in users) |                         foreach(var user in users) | ||||||
|                         { |                         {                             | ||||||
|                             if(user.Signups[idx] != "1" && user.Signups[idx] != "0" && user.Signups[idx] != "0.5") |                             if(user.Signups[idx] != "1" && user.Signups[idx] != "0" && user.Signups[idx] != "0.5") | ||||||
|                             { |                             { | ||||||
|                                 if(user.User != null) { |                                 if(user.User != null) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user