amki
5 years ago
10 changed files with 242 additions and 1 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -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; } |
||||
|
|
||||
|
} |
||||
|
} |
Loading…
Reference in new issue