Browse Source

Implement GSMeet features

master
amki 5 years ago
parent
commit
096bcb7d59
  1. BIN
      DiscoBot/98293701175955456-gsmeet.db
  2. BIN
      DiscoBot/98293701175955456-rss.db
  3. 95
      DiscoBot/gsmeet/GSMeet.cs
  4. 48
      DiscoBot/gsmeet/GSMeetContext.cs

BIN
DiscoBot/98293701175955456-gsmeet.db

Binary file not shown.

BIN
DiscoBot/98293701175955456-rss.db

Binary file not shown.

95
DiscoBot/gsmeet/GSMeet.cs

@ -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)
{ {

48
DiscoBot/gsmeet/GSMeetContext.cs

@ -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…
Cancel
Save