Bot::Module: Add postSetup to IBotModule for type info
Bot::Data: Move using statement to type definition Mod_Utils: Make mod permission checking actually work Mod_Seen: Clean upmaster
parent
509130c66f
commit
09c8b52cde
|
@ -15,13 +15,6 @@ using System.Threading.Tasks;
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
using CommandFuncDict =
|
||||
System.Collections.Generic.Dictionary<
|
||||
System.String,
|
||||
System.Tuple<
|
||||
ProjectGolan.Vrobot3.IBotModule,
|
||||
ProjectGolan.Vrobot3.BotCommandStructure>>;
|
||||
|
||||
namespace ProjectGolan.Vrobot3
|
||||
{
|
||||
// Delegate type for bot commands.
|
||||
|
@ -29,14 +22,16 @@ namespace ProjectGolan.Vrobot3
|
|||
|
||||
// Dictionary of bot commands.
|
||||
public class CommandDict : Dictionary<String, BotCommandStructure> {}
|
||||
public class CommandFuncDict :
|
||||
Dictionary<String, Tuple<IBotModule, BotCommandStructure>> {}
|
||||
|
||||
public partial class Bot
|
||||
{
|
||||
private readonly Dictionary<ulong, String> lastLine;
|
||||
private readonly Client.IChatClient client;
|
||||
|
||||
public List<IBotModule> modules { get; private set; }
|
||||
public CommandFuncDict cmdfuncs { get; private set; }
|
||||
public List<IBotModule> modules {get; private set;}
|
||||
public CommandFuncDict cmdfuncs {get; private set;}
|
||||
public readonly BotInfo info;
|
||||
|
||||
public Client.ClientInfo clientInfo => client.info;
|
||||
|
|
|
@ -70,12 +70,13 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// Used for registering commands in a module.
|
||||
//
|
||||
public struct BotCommandStructure
|
||||
public class BotCommandStructure
|
||||
{
|
||||
public BotCommand cmd;
|
||||
public String help;
|
||||
public bool hidden;
|
||||
public BotRole role;
|
||||
public Type mod;
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -104,7 +105,13 @@ namespace ProjectGolan.Vrobot3
|
|||
onSeen?.Invoke(usr, channel);
|
||||
}
|
||||
|
||||
protected IBotModule(Bot bot) { this.bot = bot; }
|
||||
protected void postSetup()
|
||||
{
|
||||
foreach(var kvp in commands)
|
||||
kvp.Value.mod = this.GetType();
|
||||
}
|
||||
|
||||
protected IBotModule(Bot bot) {this.bot = bot;}
|
||||
|
||||
public CommandDict commands = new CommandDict();
|
||||
public Events events;
|
||||
|
|
|
@ -49,6 +49,8 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
"Syntax: %action channel, msg\n" +
|
||||
"Example: %action #general, explodes violently"
|
||||
};
|
||||
|
||||
postSetup();
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -19,7 +19,7 @@ delegate void HaxFn(String name, String vname);
|
|||
|
||||
namespace ProjectGolan.Vrobot3.Modules
|
||||
{
|
||||
[BotModuleDiscord]
|
||||
[BotModuleDiscord, BotModuleDisabled]
|
||||
public class Mod_DiscordLogger : IBotModule
|
||||
{
|
||||
public Mod_DiscordLogger(Bot bot) : base(bot)
|
||||
|
@ -82,6 +82,8 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
if(delta != String.Empty)
|
||||
await verMsg(e.Server, "User updated", delta);
|
||||
});
|
||||
|
||||
postSetup();
|
||||
}
|
||||
|
||||
private EventHandler<T> catchFunc<T>(EventHandler<T> fn)
|
||||
|
|
|
@ -107,6 +107,8 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
// };
|
||||
|
||||
events.onMessage += onMessage;
|
||||
|
||||
postSetup();
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -44,6 +44,8 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
"Example: .idgames scythe, filename, 4\n" +
|
||||
"Example: .idgames"
|
||||
};
|
||||
|
||||
postSetup();
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
//
|
||||
// Mod_Links.cs
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Link title capabilities.
|
||||
// Copyright © 2016 Project Golan
|
||||
//
|
||||
// See "LICENSE" for more information.
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Link expansion.
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
|
@ -21,42 +27,35 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// Mod_Links
|
||||
//
|
||||
|
||||
public sealed class Mod_Links : IBotModule
|
||||
public class Mod_Links : IBotModule
|
||||
{
|
||||
//
|
||||
// URI
|
||||
//
|
||||
|
||||
private struct URI
|
||||
{
|
||||
public String method, host, path, query, tag, uri;
|
||||
}
|
||||
|
||||
//
|
||||
// Delegates.
|
||||
|
||||
private delegate void URIHandler(URI uri, String referer, ref String result);
|
||||
|
||||
//
|
||||
// Ctor
|
||||
// Mod_Links constructor
|
||||
//
|
||||
|
||||
public Mod_Links(Bot bot_) :
|
||||
base(bot_)
|
||||
{
|
||||
events.OnMessage += Evt_OnMessage;
|
||||
|
||||
postSetup();
|
||||
}
|
||||
|
||||
//
|
||||
// Evt_OnMessage
|
||||
//
|
||||
|
||||
public void Evt_OnMessage(UserInfo usr, String channel, String msg, bool iscmd)
|
||||
{
|
||||
//
|
||||
// Do this asynchronously, we don't want link parsing to block operation.
|
||||
|
||||
new Thread(() => {
|
||||
try
|
||||
{
|
||||
|
@ -73,7 +72,6 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// GetURITitle
|
||||
//
|
||||
|
||||
private Match GetURITitle(URI uri, String referer, int kb = 16)
|
||||
{
|
||||
String rstr = Utils.GetResponseString(uri.uri, 1024 * kb, referer);
|
||||
|
@ -87,7 +85,6 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// URI_Default
|
||||
//
|
||||
|
||||
private void URI_Default(URI uri, String referer, ref String result)
|
||||
{
|
||||
var req = WebRequest.Create(uri.uri) as HttpWebRequest;
|
||||
|
@ -112,9 +109,8 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// URI_Youtube
|
||||
//
|
||||
// Special fucking flower.
|
||||
// Special fucking snowflake.
|
||||
//
|
||||
|
||||
private void URI_Youtube(URI uri, String referer, ref String result)
|
||||
{
|
||||
var req = WebRequest.Create(uri.uri) as HttpWebRequest;
|
||||
|
@ -138,7 +134,6 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// URI_Gelooru
|
||||
//
|
||||
|
||||
private void URI_Gelbooru(URI uri, String referer, ref String result)
|
||||
{
|
||||
var match = GetURITitle(uri, referer, 8); // Should be OK to just get the first 8kb here.
|
||||
|
@ -155,7 +150,6 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// URI_Hitbox
|
||||
//
|
||||
|
||||
private void URI_Hitbox(URI uri, String referer, ref String result)
|
||||
{
|
||||
String name = WebUtility.HtmlEncode(uri.path.TrimStart(new char[]{'/'}));
|
||||
|
@ -185,7 +179,6 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// This function is really complicated because of exploits. Fuck exploits.
|
||||
//
|
||||
|
||||
private void TryParseURIs(String channel, String msg)
|
||||
{
|
||||
try
|
||||
|
@ -260,10 +253,10 @@ namespace ProjectGolan.Vrobot3
|
|||
referer = uri.method + "://" + uri.host;
|
||||
|
||||
Dictionary<String, URIHandler> handlers = new Dictionary<String, URIHandler>(){
|
||||
{ "youtube.com", URI_Youtube },
|
||||
{ "youtu.be", URI_Youtube },
|
||||
{ "gelbooru.com", URI_Gelbooru },
|
||||
{ "hitbox.tv", URI_Hitbox },
|
||||
{"youtube.com", URI_Youtube },
|
||||
{"youtu.be", URI_Youtube },
|
||||
{"gelbooru.com", URI_Gelbooru},
|
||||
{"hitbox.tv", URI_Hitbox },
|
||||
};
|
||||
|
||||
String hostst = Regex.Replace(uri.host, @"^www\.", String.Empty, RegexOptions.Multiline);
|
||||
|
|
|
@ -1,9 +1,15 @@
|
|||
//
|
||||
// Mod_Memo.cs
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright © 2016 Project Golan
|
||||
//
|
||||
// See "LICENSE" for more information.
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Memoing capabilities.
|
||||
// @memocount, .memo, .memoseen
|
||||
// .memo
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
@ -16,13 +22,11 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
//
|
||||
// Mod_Memo
|
||||
//
|
||||
|
||||
public sealed class Mod_Memo : IBotModule
|
||||
public class Mod_Memo : IBotModule
|
||||
{
|
||||
//
|
||||
// MemoFlags
|
||||
//
|
||||
|
||||
[Flags]
|
||||
enum MemoFlags
|
||||
{
|
||||
|
@ -32,33 +36,22 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
//
|
||||
// MemoInfo
|
||||
//
|
||||
|
||||
private struct MemoInfo
|
||||
{
|
||||
//
|
||||
// Data.
|
||||
|
||||
public String content;
|
||||
public String sender;
|
||||
public DateTime time;
|
||||
public MemoFlags flags;
|
||||
};
|
||||
|
||||
//
|
||||
// MemoDict
|
||||
//
|
||||
|
||||
private class MemoDict : Dictionary<String, List<MemoInfo>> {}
|
||||
|
||||
//
|
||||
// Data.
|
||||
|
||||
MemoDict memos = new MemoDict();
|
||||
|
||||
//
|
||||
// Ctor
|
||||
// Mod_Memo constructor
|
||||
//
|
||||
|
||||
public Mod_Memo(Bot bot_) :
|
||||
base(bot_)
|
||||
{
|
||||
|
@ -86,12 +79,13 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
events.OnMessage += Evt_OnMessage;
|
||||
events.OnDisconnected += Evt_OnDisconnected;
|
||||
events.OnSeen += Evt_OnSeen;
|
||||
|
||||
postSetup();
|
||||
}
|
||||
|
||||
//
|
||||
// Cmd_MemoCount
|
||||
//
|
||||
|
||||
public void Cmd_MemoCount(UserInfo usr, String channel, String msg)
|
||||
{
|
||||
bot.Reply(usr, channel, memos.Count.ToString());
|
||||
|
@ -100,7 +94,6 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
//
|
||||
// Cmd_Memo
|
||||
//
|
||||
|
||||
public void Cmd_Memo(UserInfo usr, String channel, String msg)
|
||||
{
|
||||
String[] args = Utils.GetArguments(msg, commands["memo"].help, 2, 2, ' ');
|
||||
|
@ -119,7 +112,6 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
//
|
||||
// Cmd_MemoSeen
|
||||
//
|
||||
|
||||
public void Cmd_MemoSeen(UserInfo usr, String channel, String msg)
|
||||
{
|
||||
String[] args = Utils.GetArguments(msg, commands["memoseen"].help, 2, 2, ' ');
|
||||
|
@ -139,7 +131,6 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
//
|
||||
// AddMemo
|
||||
//
|
||||
|
||||
private void AddMemo(String name, MemoInfo memo)
|
||||
{
|
||||
name = name.ToLower();
|
||||
|
@ -155,7 +146,6 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
//
|
||||
// OutputMemos
|
||||
//
|
||||
|
||||
private void OutputMemos(String channel, String realnick, bool onseen)
|
||||
{
|
||||
String nick = realnick.ToLower();
|
||||
|
@ -198,7 +188,6 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
//
|
||||
// Evt_OnMessage
|
||||
//
|
||||
|
||||
public void Evt_OnMessage(UserInfo usr, String channel, String msg, bool iscmd)
|
||||
{
|
||||
OutputMemos(channel, usr.Nick, false);
|
||||
|
@ -207,7 +196,6 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
//
|
||||
// Evt_OnSeen
|
||||
//
|
||||
|
||||
public void Evt_OnSeen(UserInfo usr, String channel)
|
||||
{
|
||||
OutputMemos(channel, usr.Nick, true);
|
||||
|
@ -216,7 +204,6 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
//
|
||||
// Evt_OnDisconnected
|
||||
//
|
||||
|
||||
public void Evt_OnDisconnected()
|
||||
{
|
||||
WriteMemos();
|
||||
|
@ -225,7 +212,6 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
//
|
||||
// WriteMemos
|
||||
//
|
||||
|
||||
private void WriteMemos()
|
||||
{
|
||||
File.WriteAllText("/srv/irc/vrobot3/data/memos." + bot.n_groupname + ".json",
|
||||
|
|
|
@ -45,6 +45,8 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
"Syntax: .quote [id]\n" +
|
||||
"Example: .quote 536"
|
||||
};
|
||||
|
||||
postSetup();
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
//
|
||||
// Mod_Seen.cs
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright © 2016 Project Golan
|
||||
//
|
||||
// See "LICENSE" for more information.
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// .seen
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
@ -17,36 +23,27 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// Mod_Seen
|
||||
//
|
||||
|
||||
public sealed class Mod_Seen : IBotModule
|
||||
public class Mod_Seen : IBotModule
|
||||
{
|
||||
//
|
||||
// SeenName
|
||||
//
|
||||
|
||||
private class SeenName
|
||||
{
|
||||
public String real, check;
|
||||
public DateTime time;
|
||||
}
|
||||
|
||||
//
|
||||
// SeenDates
|
||||
//
|
||||
|
||||
private class SeenDates : List<SeenName> {}
|
||||
|
||||
//
|
||||
// Data.
|
||||
|
||||
private SeenDates seendates = new SeenDates();
|
||||
private TimeZoneInfo burb;
|
||||
private DateTime lastwrite = DateTime.Now;
|
||||
|
||||
//
|
||||
// Ctor
|
||||
// Mod_Seen constructor
|
||||
//
|
||||
|
||||
public Mod_Seen(Bot bot_) :
|
||||
base(bot_)
|
||||
{
|
||||
|
@ -55,8 +52,8 @@ namespace ProjectGolan.Vrobot3
|
|||
bot.n_groupname + ".json"));
|
||||
|
||||
commands["seen"] = new BotCommandStructure { cmd = Cmd_Seen,
|
||||
help = "Responds with the last time I saw someone. || " +
|
||||
"Syntax: .seen person || " +
|
||||
help = "Responds with the last time I saw someone.\n" +
|
||||
"Syntax: .seen person\n" +
|
||||
"Example: .seen vrobot3"
|
||||
};
|
||||
|
||||
|
@ -64,12 +61,13 @@ namespace ProjectGolan.Vrobot3
|
|||
events.OnDisconnected += Evt_OnDisconnected;
|
||||
|
||||
burb = TimeZoneInfo.CreateCustomTimeZone("burb", new TimeSpan(10, -30, 0), "burb", "burb");
|
||||
|
||||
postSetup();
|
||||
}
|
||||
|
||||
//
|
||||
// Cmd_Seen
|
||||
//
|
||||
|
||||
public void Cmd_Seen(UserInfo usr, String channel, String msg)
|
||||
{
|
||||
if(msg.Length == 0 || msg.Contains(" "))
|
||||
|
@ -80,19 +78,11 @@ namespace ProjectGolan.Vrobot3
|
|||
if(seen.Any())
|
||||
{
|
||||
var other = seen.First();
|
||||
String outp = String.Empty;
|
||||
var fuzzy = Utils.FuzzyRelativeDate(other.time, DateTime.Now.FromNtp());
|
||||
var time = other.time.ToShortTimeString();
|
||||
var pidgeon = TimeZoneInfo.ConvertTime(other.time, TimeZoneInfo.Local, burb).ToShortTimeString();
|
||||
|
||||
outp += "I last saw ";
|
||||
outp += other.real;
|
||||
outp += " active ";
|
||||
outp += Utils.FuzzyRelativeDate(other.time, DateTime.Now.FromNtp());
|
||||
outp += ", at ";
|
||||
outp += other.time.ToShortTimeString();
|
||||
outp += " CST (";
|
||||
outp += TimeZoneInfo.ConvertTime(other.time, TimeZoneInfo.Local, burb).ToShortTimeString();
|
||||
outp += " pidgeon time).";
|
||||
|
||||
bot.Reply(usr, channel, outp);
|
||||
bot.Reply(usr, channel, $"I last saw {other.real} active {fuzzy}, at {time} CST ({pidgeon} AEST.)");
|
||||
}
|
||||
else
|
||||
bot.Reply(usr, channel, "I haven't seen " + msg + " before, sorry.");
|
||||
|
@ -103,7 +93,6 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// Evt_OnScreen
|
||||
//
|
||||
|
||||
public void Evt_OnSeen(UserInfo usr, String channel)
|
||||
{
|
||||
String name = usr.Nick.ToLower();
|
||||
|
@ -123,7 +112,6 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// Evt_OnDisconnected
|
||||
//
|
||||
|
||||
public void Evt_OnDisconnected()
|
||||
{
|
||||
WriteSeenDates();
|
||||
|
@ -132,7 +120,6 @@ namespace ProjectGolan.Vrobot3
|
|||
//
|
||||
// WriteSeenDates
|
||||
//
|
||||
|
||||
private void WriteSeenDates()
|
||||
{
|
||||
File.WriteAllText("/srv/irc/vrobot3/data/seendates." + bot.n_groupname + ".json",
|
||||
|
|
|
@ -24,6 +24,8 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
base(bot_)
|
||||
{
|
||||
events.onMessage += onMessage;
|
||||
|
||||
postSetup();
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -61,6 +61,8 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
cmd = cmdMystery,
|
||||
help = @"Does nothing. \o/"
|
||||
};
|
||||
|
||||
postSetup();
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -117,8 +119,9 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
let fhidden = kvp.Value.Item2.hidden
|
||||
let fadmin = kvp.Value.Item2.role != BotRole.User
|
||||
where
|
||||
bot.checkModPermissions(channel, this.GetType()) &&
|
||||
(admin || !fadmin) && !fhidden
|
||||
bot.checkModPermissions(channel, kvp.Value.Item2.mod) &&
|
||||
((admin && fadmin) || (!admin && !fadmin)) &&
|
||||
!fhidden
|
||||
orderby kvp.Key
|
||||
select kvp.Key;
|
||||
|
||||
|
@ -196,7 +199,7 @@ namespace ProjectGolan.Vrobot3.Modules
|
|||
"Looks good to me.",
|
||||
"Sure, why not?",
|
||||
"It is certain.",
|
||||
"Please no. Please no. Please no.",
|
||||
"pls no",
|
||||
"Yes, please.",
|
||||
"Nah.",
|
||||
"Go for it!",
|
||||
|
|
Loading…
Reference in New Issue