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.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.WebSockets;
|
||||
@ -28,6 +29,8 @@ namespace DiscoBot.gsmeet
|
||||
private static readonly string ApplicationName = "DiscoBot";
|
||||
private SheetsService service;
|
||||
|
||||
|
||||
|
||||
public GSMeet(SocketGuild guild)
|
||||
{
|
||||
this.guild = guild;
|
||||
@ -48,6 +51,7 @@ namespace DiscoBot.gsmeet
|
||||
foreach(var f in gsmeetContext.GSheets)
|
||||
{
|
||||
InitializeSheet(f);
|
||||
HandleSheetCheck(f);
|
||||
}
|
||||
|
||||
Commands.Add("gsmeetadd", HandleGSMeetAddCommand);
|
||||
@ -56,7 +60,7 @@ namespace DiscoBot.gsmeet
|
||||
Commands.Add("gsmeetdebug", HandleGSMeetDebugCommand);
|
||||
}
|
||||
|
||||
private Task InitializeSheet(GSheet sheet)
|
||||
private Task InitializeSheet(DBSheet sheet)
|
||||
{
|
||||
Console.WriteLine("Found sheet " + sheet.Name);
|
||||
Timer timer = new Timer(sheet.CheckInterval.TotalMilliseconds);
|
||||
@ -70,7 +74,7 @@ namespace DiscoBot.gsmeet
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private Task DeinitializeSheets(GSheet sheet)
|
||||
private Task DeinitializeSheets(DBSheet sheet)
|
||||
{
|
||||
/*
|
||||
Timer t = timers[feed.Name];
|
||||
@ -80,16 +84,85 @@ namespace DiscoBot.gsmeet
|
||||
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;
|
||||
c.SendMessageAsync("Checking sheet " + sheet.SheetId + " :3");
|
||||
var values = FetchRangeFromSheet(sheet.SheetId, $"{sheet.SheetName}!A1:I10");
|
||||
await c.SendMessageAsync("Checking sheet " + sheet.Id + " :3");
|
||||
var values = FetchRangeFromSheet(sheet.Id, $"{sheet.SheetName}!A1:I10");
|
||||
if (values == null || values.Count < 1)
|
||||
{
|
||||
c.SendMessageAsync("No values found.");
|
||||
return Task.CompletedTask;
|
||||
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 = "";
|
||||
foreach (var row in values)
|
||||
{
|
||||
@ -100,7 +173,7 @@ namespace DiscoBot.gsmeet
|
||||
str += "\n";
|
||||
}
|
||||
c.SendMessageAsync("Result: " + str);
|
||||
return Task.CompletedTask;
|
||||
*/
|
||||
}
|
||||
|
||||
private Task HandleGSMeetAddCommand(SocketMessage msg, string[] parameters)
|
||||
@ -112,10 +185,10 @@ namespace DiscoBot.gsmeet
|
||||
try
|
||||
{
|
||||
int timeSec = Int32.Parse(parameters[4]);
|
||||
GSheet sheet = new GSheet();
|
||||
DBSheet sheet = new DBSheet();
|
||||
sheet.Channel = gchan.Id;
|
||||
sheet.Name = name;
|
||||
sheet.SheetId = sheetId;
|
||||
sheet.Id = sheetId;
|
||||
sheet.SheetName = sheetName;
|
||||
sheet.LastChecked = DateTimeOffset.Now;
|
||||
sheet.CheckInterval = new TimeSpan(0, 0, timeSec);
|
||||
@ -124,7 +197,7 @@ namespace DiscoBot.gsmeet
|
||||
{
|
||||
gsmeetContext.SaveChanges();
|
||||
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)
|
||||
{
|
||||
|
@ -2,15 +2,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Timers;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace DiscoBot.gsmeet
|
||||
{
|
||||
public class GSMeetContext : DbContext
|
||||
{
|
||||
private ulong guildId;
|
||||
public DbSet<GSheet> GSheets { get; set; }
|
||||
public DbSet<DBSheet> GSheets { get; set; }
|
||||
|
||||
public GSMeetContext(ulong guildId)
|
||||
{
|
||||
@ -23,21 +25,57 @@ namespace DiscoBot.gsmeet
|
||||
}
|
||||
}
|
||||
|
||||
public class GSheet
|
||||
public class DBSheet
|
||||
{
|
||||
[Key]
|
||||
public string Name { get; set; }
|
||||
public string SheetId { get; set; }
|
||||
public string Id { get; set; }
|
||||
public string SheetName { get; set; }
|
||||
public ulong Channel { get; set; }
|
||||
public TimeSpan CheckInterval { 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 Name { get; set; }
|
||||
public string[] Signups { get; set; }
|
||||
public Dictionary<DateTimeOffset, string> Signups { get; set; }
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user