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