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)
|
||||||
{
|
{
|
||||||
|
var daterow = values[1];
|
||||||
|
var time = TimeSpan.Parse((string)daterow[0]);
|
||||||
|
var events = new List<DateTimeOffset>();
|
||||||
|
var users = new List<GSMeetUser>();
|
||||||
|
for (int i = 2; i < daterow.Count; ++i)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
SocketTextChannel c = guild.Channels.Where(g => g.Id == sheet.Channel).Single() as SocketTextChannel;
|
||||||
c.SendMessageAsync("Checking sheet " + sheet.SheetId + " :3");
|
await c.SendMessageAsync("Checking sheet " + sheet.Id + " :3");
|
||||||
var values = FetchRangeFromSheet(sheet.SheetId, $"{sheet.SheetName}!A1:I10");
|
var values = FetchRangeFromSheet(sheet.Id, $"{sheet.SheetName}!A1:I10");
|
||||||
if (values == null || values.Count < 1)
|
if (values == null || values.Count < 1)
|
||||||
{
|
{
|
||||||
c.SendMessageAsync("No values found.");
|
await c.SendMessageAsync("No values found.");
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
}
|
||||||
|
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