Implement GSMeet features
This commit is contained in:
		
							parent
							
								
									6b45ed1281
								
							
						
					
					
						commit
						096bcb7d59
					
				
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -1,5 +1,6 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
|  | using System.Globalization; | ||||||
| using System.IO; | using System.IO; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Net.WebSockets; | using System.Net.WebSockets; | ||||||
| @ -28,6 +29,8 @@ namespace DiscoBot.gsmeet | |||||||
|         private static readonly string ApplicationName = "DiscoBot"; |         private static readonly string ApplicationName = "DiscoBot"; | ||||||
|         private SheetsService service; |         private SheetsService service; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         public GSMeet(SocketGuild guild) |         public GSMeet(SocketGuild guild) | ||||||
|         { |         { | ||||||
|             this.guild = guild; |             this.guild = guild; | ||||||
| @ -48,6 +51,7 @@ namespace DiscoBot.gsmeet | |||||||
|             foreach(var f in gsmeetContext.GSheets) |             foreach(var f in gsmeetContext.GSheets) | ||||||
|             { |             { | ||||||
|                 InitializeSheet(f); |                 InitializeSheet(f); | ||||||
|  |                 HandleSheetCheck(f); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             Commands.Add("gsmeetadd", HandleGSMeetAddCommand); |             Commands.Add("gsmeetadd", HandleGSMeetAddCommand); | ||||||
| @ -56,7 +60,7 @@ namespace DiscoBot.gsmeet | |||||||
|             Commands.Add("gsmeetdebug", HandleGSMeetDebugCommand); |             Commands.Add("gsmeetdebug", HandleGSMeetDebugCommand); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private Task InitializeSheet(GSheet sheet) |         private Task InitializeSheet(DBSheet sheet) | ||||||
|         { |         { | ||||||
|             Console.WriteLine("Found sheet " + sheet.Name); |             Console.WriteLine("Found sheet " + sheet.Name); | ||||||
|             Timer timer = new Timer(sheet.CheckInterval.TotalMilliseconds); |             Timer timer = new Timer(sheet.CheckInterval.TotalMilliseconds); | ||||||
| @ -70,7 +74,7 @@ namespace DiscoBot.gsmeet | |||||||
|             return Task.CompletedTask; |             return Task.CompletedTask; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private Task DeinitializeSheets(GSheet sheet) |         private Task DeinitializeSheets(DBSheet sheet) | ||||||
|         { |         { | ||||||
|             /* |             /* | ||||||
|             Timer t = timers[feed.Name]; |             Timer t = timers[feed.Name]; | ||||||
| @ -80,16 +84,85 @@ namespace DiscoBot.gsmeet | |||||||
|             return Task.CompletedTask; |             return Task.CompletedTask; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private Task HandleSheetCheck(GSheet sheet) |         private Task ParseGSMeetSheet(GSMeetSheetData sheetData, IList<IList<object>> values) | ||||||
|         { |         { | ||||||
|             SocketTextChannel c = guild.Channels.Where(g => g.Id == sheet.Channel).Single() as SocketTextChannel; |             var daterow = values[1]; | ||||||
|             c.SendMessageAsync("Checking sheet " + sheet.SheetId + " :3"); |             var time = TimeSpan.Parse((string)daterow[0]); | ||||||
|             var values = FetchRangeFromSheet(sheet.SheetId, $"{sheet.SheetName}!A1:I10"); |             var events = new List<DateTimeOffset>(); | ||||||
|             if (values == null || values.Count < 1) |             var users = new List<GSMeetUser>(); | ||||||
|  |             for (int i = 2; i < daterow.Count; ++i) | ||||||
|             { |             { | ||||||
|                 c.SendMessageAsync("No values found."); |                 var col = daterow[i]; | ||||||
|  |                 var d = DateTimeOffset.Parse((string)col, null, DateTimeStyles.AssumeUniversal); | ||||||
|  |                 events.Add(d + time); | ||||||
|  |             } | ||||||
|  |             for (int i = 2; i < values.Count; ++i) | ||||||
|  |             { | ||||||
|  |                 var row = values[i]; | ||||||
|  |                 GSMeetUser u = new GSMeetUser(); | ||||||
|  |                 u.DiscordTag = (string)row[0]; | ||||||
|  |                 u.Name = (string)row[1]; | ||||||
|  |                 for (int j = 2; j < row.Count; ++j) | ||||||
|  |                 { | ||||||
|  |                     var str = (string)row[j]; | ||||||
|  |                     if(str != "") | ||||||
|  |                         u.Signups.Add(events[j - 2], str); | ||||||
|  |                 } | ||||||
|  |                 users.Add(u); | ||||||
|  |             } | ||||||
|  |             sheetData.Dates = events; | ||||||
|  |             sheetData.Users = users; | ||||||
|             return Task.CompletedTask; |             return Task.CompletedTask; | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         private async Task SignupNotify(SocketTextChannel chan, GSMeetSheetData sheetData) | ||||||
|  |         { | ||||||
|  |             foreach(var date in sheetData.Dates) | ||||||
|  |             { | ||||||
|  |                  | ||||||
|  |                 if(DateTimeOffset.UtcNow + new TimeSpan(4,0,0,0) > date) | ||||||
|  |                 { | ||||||
|  |                     await chan.SendMessageAsync("I should signup notify for " + date); | ||||||
|  |                     foreach (var user in sheetData.Users) | ||||||
|  |                     { | ||||||
|  |                         if (!user.Signups.ContainsKey(date)) | ||||||
|  |                         { | ||||||
|  |                             await chan.SendMessageAsync("Hey " + user.DiscordTag + " please sign up for our raid on " + date); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private async Task RaidNotify(SocketTextChannel chan, GSMeetSheetData sheetData) | ||||||
|  |         { | ||||||
|  |             foreach (var date in sheetData.Dates) | ||||||
|  |             { | ||||||
|  | 
 | ||||||
|  |                 if (DateTimeOffset.UtcNow + new TimeSpan(2,0,0,0) > date) | ||||||
|  |                 { | ||||||
|  |                     await chan.SendMessageAsync("I should raid notify for " + date); | ||||||
|  |                     // | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         private async Task HandleSheetCheck(DBSheet sheet) | ||||||
|  |         { | ||||||
|  |             var sheetData = new GSMeetSheetData(sheet); | ||||||
|  |             SocketTextChannel c = guild.Channels.Where(g => g.Id == sheet.Channel).Single() as SocketTextChannel; | ||||||
|  |             await c.SendMessageAsync("Checking sheet " + sheet.Id + " :3"); | ||||||
|  |             var values = FetchRangeFromSheet(sheet.Id, $"{sheet.SheetName}!A1:I10"); | ||||||
|  |             if (values == null || values.Count < 1) | ||||||
|  |             { | ||||||
|  |                 await c.SendMessageAsync("No values found."); | ||||||
|  |             } | ||||||
|  |             await ParseGSMeetSheet(sheetData, values); | ||||||
|  |             await c.SendMessageAsync("Parsed sheet " + sheet.Id); | ||||||
|  |             await SignupNotify(c, sheetData); | ||||||
|  |             await RaidNotify(c, sheetData); | ||||||
|  |             /* | ||||||
|             var str = ""; |             var str = ""; | ||||||
|             foreach (var row in values) |             foreach (var row in values) | ||||||
|             { |             { | ||||||
| @ -100,7 +173,7 @@ namespace DiscoBot.gsmeet | |||||||
|                 str += "\n"; |                 str += "\n"; | ||||||
|             } |             } | ||||||
|             c.SendMessageAsync("Result: " + str); |             c.SendMessageAsync("Result: " + str); | ||||||
|             return Task.CompletedTask; |             */ | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private Task HandleGSMeetAddCommand(SocketMessage msg, string[] parameters) |         private Task HandleGSMeetAddCommand(SocketMessage msg, string[] parameters) | ||||||
| @ -112,10 +185,10 @@ namespace DiscoBot.gsmeet | |||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 int timeSec = Int32.Parse(parameters[4]); |                 int timeSec = Int32.Parse(parameters[4]); | ||||||
|                 GSheet sheet = new GSheet(); |                 DBSheet sheet = new DBSheet(); | ||||||
|                 sheet.Channel = gchan.Id; |                 sheet.Channel = gchan.Id; | ||||||
|                 sheet.Name = name; |                 sheet.Name = name; | ||||||
|                 sheet.SheetId = sheetId; |                 sheet.Id = sheetId; | ||||||
|                 sheet.SheetName = sheetName; |                 sheet.SheetName = sheetName; | ||||||
|                 sheet.LastChecked = DateTimeOffset.Now; |                 sheet.LastChecked = DateTimeOffset.Now; | ||||||
|                 sheet.CheckInterval = new TimeSpan(0, 0, timeSec); |                 sheet.CheckInterval = new TimeSpan(0, 0, timeSec); | ||||||
| @ -124,7 +197,7 @@ namespace DiscoBot.gsmeet | |||||||
|                 { |                 { | ||||||
|                     gsmeetContext.SaveChanges(); |                     gsmeetContext.SaveChanges(); | ||||||
|                     InitializeSheet(sheet); |                     InitializeSheet(sheet); | ||||||
|                     msg.Channel.SendMessageAsync("Sheet " + sheet.Name + " with id " + sheet.SheetId + " saved."); |                     msg.Channel.SendMessageAsync("Sheet " + sheet.Name + " with id " + sheet.Id + " saved."); | ||||||
|                 } |                 } | ||||||
|                 catch (InvalidOperationException) |                 catch (InvalidOperationException) | ||||||
|                 { |                 { | ||||||
|  | |||||||
| @ -2,15 +2,17 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.ComponentModel.DataAnnotations; | using System.ComponentModel.DataAnnotations; | ||||||
|  | using System.Timers; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  | using System.ComponentModel.DataAnnotations.Schema; | ||||||
| 
 | 
 | ||||||
| namespace DiscoBot.gsmeet | namespace DiscoBot.gsmeet | ||||||
| { | { | ||||||
|     public class GSMeetContext : DbContext |     public class GSMeetContext : DbContext | ||||||
|     { |     { | ||||||
|         private ulong guildId; |         private ulong guildId; | ||||||
|         public DbSet<GSheet> GSheets { get; set; } |         public DbSet<DBSheet> GSheets { get; set; } | ||||||
| 
 | 
 | ||||||
|         public GSMeetContext(ulong guildId) |         public GSMeetContext(ulong guildId) | ||||||
|         { |         { | ||||||
| @ -23,21 +25,57 @@ namespace DiscoBot.gsmeet | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public class GSheet |     public class DBSheet | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|         public string Name { get; set; } |         public string Name { get; set; } | ||||||
|         public string SheetId { get; set; } |         public string Id { get; set; } | ||||||
|         public string SheetName { get; set; } |         public string SheetName { get; set; } | ||||||
|         public ulong Channel { get; set; } |         public ulong Channel { get; set; } | ||||||
|         public TimeSpan CheckInterval { get; set; } |         public TimeSpan CheckInterval { get; set; } | ||||||
|         public DateTimeOffset LastChecked { get; set; } |         public DateTimeOffset LastChecked { get; set; } | ||||||
|  |         public List<GSMeetEventNotification> NotifiedEvents { get; set; } | ||||||
|  |         public List<GSMeetUserNotification> NotifiedDates { get; set; } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public class GSSignup |     public class GSMeetEventNotification | ||||||
|     { |     { | ||||||
|  |         [ScaffoldColumn(false)] | ||||||
|  |         [DatabaseGenerated(DatabaseGeneratedOption.Identity)] | ||||||
|  |         [Key] | ||||||
|  |         public long Id { get; set; } | ||||||
|  |         public DateTimeOffset Date { get; set; } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public class GSMeetUserNotification | ||||||
|  |     { | ||||||
|  |         [ScaffoldColumn(false)] | ||||||
|  |         [DatabaseGenerated(DatabaseGeneratedOption.Identity)] | ||||||
|  |         [Key] | ||||||
|  |         public long Id { get; set; } | ||||||
|  |         public string DiscordTag { get; set; } | ||||||
|  |         public DateTimeOffset Date { get; set; } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public class GSMeetSheetData | ||||||
|  |     { | ||||||
|  |         public GSMeetSheetData(DBSheet sheet) | ||||||
|  |         { | ||||||
|  |             this.Sheet = sheet; | ||||||
|  |         } | ||||||
|  |         public DBSheet Sheet { get; set; } | ||||||
|  |         public List<GSMeetUser> Users { get; set; } | ||||||
|  |         public List<DateTimeOffset> Dates { get; set; } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public class GSMeetUser | ||||||
|  |     { | ||||||
|  |         public GSMeetUser() | ||||||
|  |         { | ||||||
|  |             this.Signups = new Dictionary<DateTimeOffset, string>(); | ||||||
|  |         } | ||||||
|         public string DiscordTag { get; set; } |         public string DiscordTag { get; set; } | ||||||
|         public string Name { get; set; } |         public string Name { get; set; } | ||||||
|         public string[] Signups { get; set; } |         public Dictionary<DateTimeOffset, string> Signups { get; set; } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user