1
0
Fork 0
Browse Source

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 up
master
Graham 6 years ago
parent
commit
09c8b52cde
  1. 13
      Source/Bot/Data.cs
  2. 11
      Source/Bot/Module.cs
  3. 8
      Source/Modules/Mod_Admin.cs
  4. 4
      Source/Modules/Mod_DiscordLogger.cs
  5. 2
      Source/Modules/Mod_Fun.cs
  6. 2
      Source/Modules/Mod_Idgames.cs
  7. 43
      Source/Modules/Mod_Links.cs
  8. 40
      Source/Modules/Mod_Memo.cs
  9. 4
      Source/Modules/Mod_Quote.cs
  10. 53
      Source/Modules/Mod_Seen.cs
  11. 2
      Source/Modules/Mod_Shittalk.cs
  12. 9
      Source/Modules/Mod_Utils.cs

13
Source/Bot/Data.cs

@ -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;

11
Source/Bot/Module.cs

@ -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;

8
Source/Modules/Mod_Admin.cs

@ -28,14 +28,14 @@ namespace ProjectGolan.Vrobot3.Modules
base(bot)
{
commands["kill"] = new BotCommandStructure{
cmd = cmdKill,
cmd = cmdKill,
role = BotRole.Admin,
help = "Kills all bot instances.\n" +
"Syntax: %kill"
};
commands["msg"] = new BotCommandStructure{
cmd = cmdMsg,
cmd = cmdMsg,
role = BotRole.Admin,
help = "Sends a message.\n" +
"Syntax: %msg channel, msg\n" +
@ -43,12 +43,14 @@ namespace ProjectGolan.Vrobot3.Modules
};
commands["action"] = new BotCommandStructure{
cmd = cmdAction,
cmd = cmdAction,
role = BotRole.Admin,
help = "Sends an action.\n" +
"Syntax: %action channel, msg\n" +
"Example: %action #general, explodes violently"
};
postSetup();
}
//

4
Source/Modules/Mod_DiscordLogger.cs

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

2
Source/Modules/Mod_Fun.cs

@ -107,6 +107,8 @@ namespace ProjectGolan.Vrobot3.Modules
// };
events.onMessage += onMessage;
postSetup();
}
//

2
Source/Modules/Mod_Idgames.cs

@ -44,6 +44,8 @@ namespace ProjectGolan.Vrobot3.Modules
"Example: .idgames scythe, filename, 4\n" +
"Example: .idgames"
};
postSetup();
}
//

43
Source/Modules/Mod_Links.cs

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

40
Source/Modules/Mod_Memo.cs

@ -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",

4
Source/Modules/Mod_Quote.cs

@ -40,11 +40,13 @@ namespace ProjectGolan.Vrobot3.Modules
base(bot_)
{
commands["quote"] = new BotCommandStructure{
cmd = cmdQuote,
cmd = cmdQuote,
help = "Get a quote from the Doominati Quote DB.\n" +
"Syntax: .quote [id]\n" +
"Example: .quote 536"
};
postSetup();
}
//

53
Source/Modules/Mod_Seen.cs

@ -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(" "))
@ -79,20 +77,12 @@ namespace ProjectGolan.Vrobot3
var seen = from sdata in seendates where sdata.check == name select sdata;
if(seen.Any())
{
var other = seen.First();
String outp = String.Empty;
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);
var other = seen.First();
var fuzzy = Utils.FuzzyRelativeDate(other.time, DateTime.Now.FromNtp());
var time = other.time.ToShortTimeString();
var pidgeon = TimeZoneInfo.ConvertTime(other.time, TimeZoneInfo.Local, burb).ToShortTimeString();
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",

2
Source/Modules/Mod_Shittalk.cs

@ -24,6 +24,8 @@ namespace ProjectGolan.Vrobot3.Modules
base(bot_)
{
events.onMessage += onMessage;
postSetup();
}
//

9
Source/Modules/Mod_Utils.cs

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