develop_plugin_ja - noonworks/Nursery GitHub Wiki
ãã©ã°ã€ã³å¶äœ
1. ãã«ãç°å¢
- Visual Studio 2017
- .NET Framework 4.6.1
- C#
- ãœãŒã¹ããã®ãã«ããåç §ããæ¬äœããã«ãã§ããããã«ããŠãããŠãã ãã
2. ãã©ã°ã€ã³ã®åºæ¬
C#ã«ããããã°ã©ãã³ã°ã®åºæ¬ã¯çè§£ããŠããåæã§èª¬æããŸãã
2-1. ãã©ã°ã€ã³ã»ã¯ã©ã¹
- ãã©ã°ã€ã³ã¯
IPlugin
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããã¯ã©ã¹ã§ãã - ã²ãšã€ã®dllãã¡ã€ã«ã®äžã«è€æ°ã®ãã©ã°ã€ã³ã»ã¯ã©ã¹ããã£ãŠãããŸããŸããã
- é¢é£ãããã©ã°ã€ã³ã¯ãŸãšããŠã²ãšã€ã®dllã«ããæ¹ãããã§ãããã
- äŸïŒSoundEffectPlugin.dllã«ã¯ãé³å£°ã®åçã忢ããªã¹ã衚瀺ãåèªã¿èŸŒã¿ããã4ã€ã®ã³ãã³ãã»ãã©ã°ã€ã³ããŸãšããããŠããŸãã
2-2. ãã©ã°ã€ã³ã®èªã¿èŸŒã¿
Nurseryæ¬äœã®PluginManager
ã¯ãèµ·åæã«ä»¥äžã®ããã«ãã©ã°ã€ã³ã»ã¯ã©ã¹ã®èªã¿èŸŒã¿ãšåæåãè¡ããŸãã
plugins
ãã©ã«ãå ã®dllãã¡ã€ã«ãèªã¿èŸŒã¿- dllãã¡ã€ã«å
ã«å®çŸ©ãããŠããåã®ãã¡ã
IPlugin
ã«ãã£ã¹ãã§ãããã®ãèªã¿èŸŒã¿ plugins\plugins.config
ã®plugins
ã«èšèŒãããŠããé çªã§é åã«æ ŒçŽ- åãã©ã°ã€ã³ã®
Initialize
ã¡ãœãããåŒã³åºã
2-3. åºæ¬åœ¢
// äœãããªããã©ã°ã€ã³ã®ãµã³ãã«
using Nursery.Plugins;
namespace MyPlugin.SamplePlugins {
public class DoNothingCommand : IPlugin {
public string Name { get; } = "MyPlugins.SamplePlugins.DoNothingCommand";
public string HelpText { get; } = "Command to do nothing.";
Plugins.Type IPlugin.Type => Plugins.Type.Command;
public void Initialize(IPluginManager loader, IPlugin[] plugins) { }
public bool Execute(IBot bot, IMessage message) {
return false;
}
}
}
namespace MyPlugins.SamplePlugin
ã«ã¯ãèªåã®ãã©ã°ã€ã³ã«åã£ãååãã€ããŠãã ããã- ã¯ã©ã¹åã«å¶éã¯ãããŸãããããã©ã°ã€ã³åãšåãã«ãããšããã§ãããã
Name
2-3-1. - ãã©ã°ã€ã³ã®ååãå®çŸ©ããŸããèšå®ãã¡ã€ã«ãªã©ã§äœ¿ãããå€ã§ãã
- ä»ãšã®éè€ãé¿ããããã«ã
namespace.class
ãšãã圢åŒã®æååã«ãããšããã§ãããã - ãã®å€ã¯åœéå察å¿ãããªãããã«ããŠãã ããã
HelpText
2-3-2. - ãã©ã°ã€ã³ã®ãã«ãããã¹ãã§ãã
help
ã³ãã³ãã§äœ¿ãããŸãã - åœéå察å¿ïŒåŸè¿°ïŒããããšãããããããããªãã§ãããã
Type
2-3-3. Command
ã¯ãããŠãŒã¶ãŒãã³ãã³ããéä¿¡ããããã«å¿ããåŠçãè¡ãããããã©ã°ã€ã³ã§ãã@nursery-bot come
ã®ããã«ãBotãžã®ã¡ã³ã·ã§ã³åœ¢åŒã§éä¿¡ãããããšãå€ããã©ã°ã€ã³ã§ãã- ãã ããå¿
ãã¡ã³ã·ã§ã³ã§ãªããšãããªãããã§ã¯ãããŸãããäŸãã°SEãã©ã°ã€ã³ã®
SoundEffectCommand
ã¯ãã¡ã³ã·ã§ã³ä»¥å€ã®ããŒã¯ãŒãã«åå¿ããŠSEã鳎ãããŸãã
Filter
ã¯ããã¡ãã»ãŒãžå å·¥åŠçãè¡ãããã©ã°ã€ã³ã§ãã- ãã¿ãŒã³ãªã©ã«å¿ããŠã¡ãã»ãŒãžã®æååãå å·¥ããåŠçãè¡ããŸãã
- ãŸããæ¡ä»¶ã«äžèŽããã¡ãã»ãŒãžãç¡èŠããïŒèªã¿äžããªãïŒãšãã£ã倿ãè¡ããŸãã
Scheduler
ã¯ããã¹ã±ãžã¥ãŒã«ãç»é²ããããã©ã°ã€ã³ã§ãã- ç£èŠæ©èœãã¿ã€ããŒæ©èœãªã©ãç»é²ããŸãã
å®éã®ãšãããCommand
ãFilter
ãScheduler
ã«å³å¯ãªåºå¥ã¯ãããŸããã
ç®å®ãšããŠã¯ãããŠãŒã¶ãŒãå®è¡ãæå³ããŠéä¿¡ãããã®ã¯ã³ãã³ãããã¹ã±ãžã¥ãŒã«ãç»é²ãããã®ã¯ã¹ã±ãžã¥ãŒã©ãããã以å€ã¯ãã£ã«ã¿ããšããåºåã§ããã§ãããã
Initialize
2-3-4. - ãã©ã°ã€ã³ã®åæååŠçãè¡ããŸãã
- å žåçã«ã¯ããã©ã°ã€ã³çšã®èšå®ãã¡ã€ã«ãèªã¿èŸŒã¿ãŸãã
- ã¹ã±ãžã¥ãŒã©ã®äžã«ã¯ãåæåæã«ã¹ã±ãžã¥ãŒã«ãç»é²ããã ãã§æ©èœãå®çµãããã®ãããåŸãŸãã
// ã·ã³ãã«ãªèšå®ãã¡ã€ã«ãèªã¿èŸŒããã©ã°ã€ã³ã®ãµã³ãã«
using Newtonsoft.Json;
using Nursery.Plugins;
using Nursery.Utility;
namespace MyPlugin.SamplePlugins {
// èšå®ãã¡ã€ã«ã®ã¯ã©ã¹ã詳现ã¯Newtonsoft.Jsonã®ããã¥ã¡ã³ããåç
§ã
// èšå®ãã¡ã€ã«ãèªããªãã£ããšãã®ããã«ãããã©ã«ãå€ãèšå®ããããã«ããŸããã
[JsonObject("MyPlugin.SamplePlugins.DoNothingCommandConfig")]
public class DoNothingCommandConfig {
[JsonProperty("name")]
public string Name { get; set; } = "SampleName";
[JsonProperty("age")]
public int Age { get; set; } = 20;
}
public class DoNothingCommand : IPlugin {
public string Name { get; } = "MyPlugins.SamplePlugins.DoNothingCommand";
public string HelpText { get; } = "Command to do nothing.";
Plugins.Type IPlugin.Type => Plugins.Type.Command;
// èšå®ãä¿æããã¡ã³ã
private DoNothingCommandConfig config = null;
public void Initialize(IPluginManager loader, IPlugin[] plugins) {
try {
// èšå®ã®èªã¿èŸŒã¿
this.config = loader.GetPluginSetting<DoNothingCommandConfig>(this.Name);
} catch (System.Exception e) {
// èšå®ãã¡ã€ã«ããªããŠãæ°ã«ããªãå Žåã¯ããšã©ãŒã®ãã°ã ãåºã
Logger.DebugLog(e.ToString());
this.config = null;
// ãšã©ãŒãšããŠããã°ã©ã ã®èµ·åã倱æããããå Žåã¯ãã®äŸå€ããã£ããããªããã°ãã
}
if (this.config == null) {
// ããã©ã«ãã®èšå®ã䜿ã
this.config = new DoNothingCommandConfig();
}
}
public bool Execute(IBot bot, IMessage message) {
return false;
}
}
}
IPluginManager.GetPluginSetting<T>(string Name)
2-3-4-1. - JSON圢åŒã®èšå®ãã¡ã€ã«ãèªã¿èŸŒããã«ããŒã¡ãœããã§ãã
- ãã©ã°ã€ã³ãã£ã¬ã¯ããªã«ããã
Name
ã«æå®ããæååã«.json
ãã€ãããã¡ã€ã«ãèªã¿èŸŒã¿ãŸããéåžžã¯ãã©ã°ã€ã³åã䜿ããšããã§ãããã T
ã¯èšå®ãã¡ã€ã«ãèªã¿èŸŒãåã§ãã
IPlugin[] plugins
2-3-4-2. åŒæ° - èªã¿èŸŒãŸãããã©ã°ã€ã³ã®é åã§ãã
- é
åå
ã®åãã©ã°ã€ã³ã¯ ãŸã
Initialize
ãè¡ãããŠããªãå¯èœæ§ããã ã®ã§æ³šæããŠãã ããã- äŸãã°ãåäœã®åæãšããŠä»ã®ãã©ã°ã€ã³ãå¿ èŠãªã®ã§ããã®ãã©ã°ã€ã³ãèªã¿èŸŒãŸããŠããã確èªã ããããåŠçã«äœ¿çšããŸãã
- ãã ãããä»ã®ãã©ã°ã€ã³ã
Initialize
ã§èªã¿èŸŒãã èšå®ãã¡ã€ã«ã®å€ãå©çšãããããšã¯ ã§ããŸããã ãã®æç¹ã§ã¯ããŸã ãã®ãã©ã°ã€ã³ã®Initialize
ãå®äºããŠããä¿èšŒããããŸããã - ä»ã®ãã©ã°ã€ã³ã®èšå®ãã¡ã€ã«ãåç
§ãããå Žåããã©ã°ã€ã³ã®æåã®
Execute
ã®éã«èªãããã«ããŠãã ãããSoundEffectPlugin
ã®SoundEffectReload
ãªã©ã®ã³ãŒããåèã«ããŠãã ããã
Execute
2-3-5. - ãã©ã°ã€ã³ã®ã¡ã€ã³åŠçéšåã§ãã
- ã¹ã±ãžã¥ãŒã©ã®äžã«ã¯ãåæåæã«ã¹ã±ãžã¥ãŒã«ãç»é²ããã ãã§ãã¡ã€ã³åŠçã¯äœãè¡ããªããã®ãããåŸãŸãã
// ã¡ãã»ãŒãžã®æåŸã«æååãä»ãå ãããã©ã°ã€ã³ã®ãµã³ãã«
using Nursery.Plugins;
namespace MyPlugin.SamplePlugins {
public class AddDokabenFilter : IPlugin {
public string Name { get; } = "MyPlugins.SamplePlugins.AddDokabenFilter";
public string HelpText { get; } = "Add dokaben to message.";
Plugins.Type IPlugin.Type => Plugins.Type.Filter;
public void Initialize(IPluginManager loader, IPlugin[] plugins) {}
public bool Execute(IBot bot, IMessage message) {
if (message.Content.Length == 0) {
// æ¬æã空ã ã£ãããã®ãã©ã°ã€ã³ã¯é©çšããªã
return false;
}
// æ¬æã空ã§ãªãã£ãããæ«å°Ÿã«æååã远å
message.Content = message.Content + " ãã«ãã³";
// ãã®ãã©ã°ã€ã³ãé©çšããããšãæç€º
message.AppliedPlugins.Add(this.Name);
return true;
}
}
}
IBot bot
2-3-5-1. åŒæ° - Botã®ã¯ã©ã¹ã§ããBotã®æ å ±ãååŸããããBotãå ¥é宀ãããããã·ã¹ãã ã¡ãã»ãŒãžãçºèšãããããšãã§ããŸãã
- ã¡ã³ãã¯
IBot
ã€ã³ã¿ãŒãã§ãŒã¹ãåç §ããŠãã ããã
IMessage message
2-3-5-2. åŒæ° - éä¿¡ãããã¡ãã»ãŒãžã®ã¯ã©ã¹ã§ãã
- ã¡ã³ãã¯
IMessage
ã€ã³ã¿ãŒãã§ãŒã¹ãåç §ããŠãã ããã
IMessage.Content
ã®æžãæã
2-3-5-3. - èªã¿äžããæååãå å·¥ããå Žåã¯ã
IMessage.Content
ãæžãæããŠãã ããã IMessage.Content
ã¯ãèªåããåã«ä»ã®ãã©ã°ã€ã³ã«ãã£ãŠæžãæããããŠããå¯èœæ§ããããŸãã- ãŸããèªåããåŸã«ä»ã®ãã©ã°ã€ã³ã«ãã£ãŠæžãæããããå¯èœæ§ããããŸãã
- ãããé²ãããå Žåã¯ãåŸè¿°ã®
Terminated
ã®äœ¿çšãæ€èšããŠãã ããã
- ãããé²ãããå Žåã¯ãåŸè¿°ã®
IMessage.Original.Content
ã¯ããã©ã°ã€ã³ã«ããæžãæããè¡ãããŠããªãå ã®ã¡ãã»ãŒãžæ¬æãã§ãã
IMessage.AppliedPlugins
2-3-5-4. IMessage.AppliedPlugins
ã¯ããä»ãŸã§ã«ãã®ã¡ãã»ãŒãžã«é©çšããããã©ã°ã€ã³ã®ååãã®ãªã¹ãã§ãã- ãããå©çšããŠããããã©ã°ã€ã³ãé©çšãããŠããå Žåã¯åŠçãããªãããªã©ã®æ¡ä»¶åå²ãå¯èœã§ãã
- èªåã®ãã©ã°ã€ã³ã§åŠçãè¡ã£ããšãã¯ã
message.AppliedPlugins.Add(this.Name);
ã§èªåã®ãã©ã°ã€ã³ã®ååã远å ããŸãã
IMessage.Terminated
2-3-5-5. IMessage.Terminated
ãtrue
ã«ããå Žåãæ¬¡ä»¥éã®ãã©ã°ã€ã³ã®åŠçãè¡ãããªããªããŸããJoinCommand
ãªã©ã®ã³ãã³ãã§ã¯ãã³ãã³ããå®è¡ããããã以éã®åŠçïŒèªã¿äžããã¹ããã倿ãããæååã倿ãããªã©ïŒã¯äžèŠã«ãªããŸãããããã£ãå Žåã«Terminated
ã䜿çšããŸãã
public bool Execute(IBot bot, IMessage message) {
//
// ïŒåŠçã¯çç¥ïŒ
//
// ãã®ãã©ã°ã€ã³ãé©çšããããšãæç€º
message.AppliedPlugins.Add(this.Name);
// ãã以éã®ãã©ã°ã€ã³åŠçãå®è¡ãããªã
message.Terminated = true;
return true;
}
2-3-5-6. æ»ãå€
ãã©ã°ã€ã³ãé©çšããå Žåã¯true
ãé©çšããªãã£ãå Žåã¯false
ãè¿ããŸãã
3. ã¹ã±ãžã¥ãŒã«
3-1. ã¹ã±ãžã¥ãŒã«ã®æŠèŠ
ã¹ã±ãžã¥ãŒã«ã¯ãã¡ãã»ãŒãžã®åä¿¡ãšã¯ç°ãªãã¿ã€ãã³ã°ã§å®è¡å¯èœãªåŠçã§ããã¹ã±ãžã¥ãŒã«ã䜿ããšä»¥äžã®ãããªæ©èœãå®çŸã§ããŸãã
- Nurseryã®ç¶æ ãDiscordã®ç¶æ ãç£èŠããç¶æ ãå€åãããäœããããã
- ç¹å®ã®æ¥æã«äœããããã
3-2. ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ãšã¿ã€ããŒã®æŠèŠ
- ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã¯ãæ¡ä»¶ãšåŠçå 容ãæã£ããªããžã§ã¯ãã§ãã
- Nurseryã®botã¯ãã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã®ãªã¹ããæã£ãŠããŸãã
- Nurseryã®botã¯ã100ããªç§ããšã«èµ·åããã¿ã€ããŒãæã£ãŠããŸãã
- ã¿ã€ããŒãèµ·åãããšããªã¹ãå ã®ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ãé ã«èµ·åãããŸãã
- ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã¯ãã®äžã§ä»»æã®åŠçãè¡ããŸãã
3-3. ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã®ç»é²
ãã©ã°ã€ã³ããã¯ãIBot
ãããã¯IPluginManager
ã®AddSchedule
ã¡ãœããã䜿çšããŠãbotã«ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ãç»é²ããŸãã
public interface IBot {
void AddSchedule(IScheduledTask schedule);
}
public interface IPluginManager {
void AddSchedule(IScheduledTask schedule);
}
IScheduledTask
ã€ã³ã¿ãŒãã§ãŒã¹
3-4. ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ãæäœéåããªããŠã¯ãªããªãã€ã³ã¿ãŒãã§ãŒã¹ã§ãã
public interface IScheduledTask {
string Name { get; }
bool Finished { get; }
IScheduledTask[] Execute(IBot bot);
}
Name
ãããã㣠: ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã«ä»»æã®ååãã€ããŸããèå¥ã®ããã«äœ¿çšããŸããFinished
ãããã㣠: ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ãå®äºãããã©ããã瀺ããŸããFinished
ãtrue
ã®ãã®ã¯ãã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã®ãªã¹ãããæ¶å»ãããŸããFinished
ãfalse
ã®ãã®ã¯ãããšãåŠçãå®è¡ããããšããŠãããªã¹ãã«æ®ãç¶ããŸãã
Execute
ã¡ãœãã : ã¿ã€ããŒããåŒã°ããã¡ãœããã§ãã- åŒæ°ã«ã¯botã®ã€ã³ã¹ã¿ã³ã¹ãæž¡ãããŸãã
- æ»ãå€ã¯ãæ°ããç»é²ããã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã®é
åãã§ãã
- ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯å ã§æ°ããã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ãçæãããããç»é²ãããå Žåã«äœ¿ããŸãã
- ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯å
ã§ã¯
IBot
ã®AddSchedule
ã¡ãœããã䜿çšããªãã§ãã ããã - 空ã®é
åãããã¯
null
ã®å Žåãæ°ããã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã远å ããŸããã
Nursery.Plugins.Schedules.ScheduledTaskBase
ã¯ã©ã¹
3-5. ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã§ããäœ¿ãæ©èœãå®è£ ãããã«ããŒæœè±¡ã¯ã©ã¹ã§ãã
Execute
ã¡ãœãããCheck
ãšDoExecute
ã«åå²ããæ¡ä»¶ãšåŠçãåããŠèšè¿°ã§ããããã«ããŠããCheck
ã§çŸå𿥿ã䜿çšã§ããããã«ããŠãã- botã®ã¡ãã»ãŒãžéä¿¡ã«äœ¿ãããã«ããŒã¡ãœãã
Send
ãå®è£ ããŠãã
äžè¬çãªã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã¯ãIScheduledTask
ã€ã³ã¿ãŒãã§ãŒã¹ããã®ãŸãŸå®è£
ããããããã®ãã«ããŒã¯ã©ã¹ãç¶æ¿ããæ¹ãç°¡åã«äœæã§ããŸãã
3-5-1. ç¶æ¿åŸã«å®è£ ããå¿ èŠã®ããã¡ãœãã
public abstract class ScheduledTaskBase : IScheduledTask {
public ScheduledTaskBase(string Name);
abstract protected bool DoCheck(IBot bot);
abstract protected IScheduledTask[] DoExecute(IBot bot);
}
å®è£
äŸãšããŠã¯Nursery.BasicPlugins.WelcomeTask
ãåèã«ããŠãã ããã
ScheduledTaskBase
ïŒã³ã³ã¹ãã©ã¯ã¿ïŒ
3-5-1-1. ãµãã¯ã©ã¹ãããã®ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãåŒã¶ããã«ããŠãã ããã
public class SampleTask : ScheduledTaskBase {
public SampleTask(): base("MyPlugin.SampleTask") {}
}
DoCheck
ã¡ãœãã
3-5-1-2. - ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ãå®è¡ãããå€å®ããã¡ãœããã§ãã
- åŒæ°ã«ã¯botã®ã€ã³ã¹ã¿ã³ã¹ãæž¡ãããŸãã
- æ»ãå€ã«ã¯
DoExecute
ãå®è¡ãããã©ãããè¿ããŸããtrue
ã®å Žåã¯å®è¡ããŸããfalse
ã®å Žåå®è¡ããŸããã
DoExecute
ã¡ãœãã
3-5-1-3. - ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã®äž»ãªåŠçãè¡ãã¡ãœããã§ãã
- åŒæ°ã«ã¯botã®ã€ã³ã¹ã¿ã³ã¹ãæž¡ãããŸãã
- æ»ãå€ã¯ãæ°ããç»é²ããã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã®é
åãã§ãã
- ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯å ã§æ°ããã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ãçæãããããç»é²ãããå Žåã«äœ¿ããŸãã
- ã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯å
ã§ã¯
IBot
ã®AddSchedule
ã¡ãœããã䜿çšããªãã§ãã ããã - 空ã®é
åãããã¯
null
ã®å Žåãæ°ããã¹ã±ãžã¥ãŒã«ã¿ã¹ã¯ã远å ããŸããã
3-5-2. ãã®ä»ã®ãã«ããŒã¡ãœãããšã¡ã³ã倿°
public abstract class ScheduledTaskBase : IScheduledTask {
protected DateTime CheckedAt { get; set; }
protected void Send(ScheduledMessage[] Messages, IBot bot);
}
CheckedAt
3-5-2-1. ã¡ã³ã倿°Check
ã¡ãœãããåŒã³åºãããæ¥æâExecute
ã¡ãœãããåŒã³åºãããæ¥æãä¿åãããŠããŸãã
Send
ã¡ãœãã
3-5-2-2. - ãbotã«ããDiscordãžã®ã¡ãã»ãŒãžéä¿¡ããããã¯ãbotã«ããæ£èªã¿ã¡ãããžã®èªã¿äžãã¡ãã»ãŒãžéä¿¡ããè¡ãã¡ãœããã§ãã
DoExecute
ã®åŠçäžã«åŒã³åºãããšãã§ããŸãã- éä¿¡ããã¡ãã»ãŒãžã¯
ScheduledMessage
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§æå®ããŸãã
public class ScheduledMessage {
public ScheduledMessageType Type = ScheduledMessageType.DoNothing;
public string Content = "";
public string[] TextChannelIds = new string[] { };
public bool CutIfTooLong = true;
}
public enum ScheduledMessageType {
DoNothing,
SendMessage,
Talk,
}
ScheduledMessageType
: ã¡ãã»ãŒãžã®çš®é¡ãæå®ããŸããScheduledMessageType.DoNothing
: ã¡ãã»ãŒãžãéããŸãããScheduledMessageType.SendMessage
: Discordãžã¡ãã»ãŒãžãéä¿¡ããŸããScheduledMessageType.Talk
: æ£èªã¿ã¡ãããžé³èªã¡ãã»ãŒãžãéä¿¡ããŸãã
Content
: ã¡ãã»ãŒãžã®ããã¹ããæå®ããŸããç¹æ®æžåŒã䜿çšã§ããŸãã- ç¹æ®æžåŒã®å€æåŠçã¯
Send
ã¡ãœããå ã§è¡ãããã®ã§ãäºåã«å€æããå¿ èŠã¯ãããŸããã
- ç¹æ®æžåŒã®å€æåŠçã¯
TextChannelIds
: Discordãžã¡ãã»ãŒãžãéä¿¡ããå Žåãéä¿¡å ã®ããã¹ããã£ã³ãã«ã®IDãstring[]
ã§æå®ããŸããnull
ãããã¯ç©ºã®é åã®å Žåãããã©ã«ãã®ããã¹ããã£ã³ãã«ã«éä¿¡ãããŸãã
CutIfTooLong
: Discordãžã¡ãã»ãŒãžãéä¿¡ããå Žåã§ãããã¹ããé·ããããšãïŒ2000æåãè¶ ãããšãïŒã®åŠçãæå®ããŸããtrue
ã®å Žåãæå€§æåæ°ããæº¢ããã¡ãã»ãŒãžãåé€ããŸããfalse
ã®å Žåãã¡ãã»ãŒãžãè€æ°ã«åããŠãã¹ãŠéä¿¡ããŸãã
4. ãã«ããŒã¯ã©ã¹
AbstractMentionKeywordCommand
ã¯ã©ã¹
4-1. - ã³ãã³ããã©ã°ã€ã³ã«ããããã
@nursery-bot keyword
圢åŒã®ã¡ã³ã·ã§ã³ãšããŒã¯ãŒãã®å€å®ãç°¡åã«è¡ããã«ããŒã¯ã©ã¹ã§ãã - ç¶æ¿ããŠäœ¿ããŸãã
// ã¡ã³ã·ã§ã³ã»ããŒã¯ãŒã圢åŒã®ã³ãã³ããµã³ãã«
using Nursery.Plugins;
namespace MyPlugin.SamplePlugins {
public class DokabenCommand : AbstractMentionKeywordCommand {
public string Name { get; } = "MyPlugins.SamplePlugins.DokabenCommand";
public string HelpText { get; } = "Say dokaben command.";
// Typeã¯Commandã«èšå®æžã¿
// ããŒã¯ãŒã
public JoinCommand() : base(new string[] { "dokaben", "yamada", "tarou" }) { }
public void Initialize(IPluginManager loader, IPlugin[] plugins) {}
protected override bool DoExecute(int keywordIndex, IBot bot, IMessage message) {
// ã³ãã³ãéä¿¡è
ã«è¿ä¿¡ãã
bot.SendMessageAsync(message.Original.Channel,
message.Original.Author.Mention + " ãã«ãã³");
// ã¡ãã»ãŒãžèªã¿äžãã¯ç¡ãïŒïŒç©ºçœïŒã«ãã
message.Content = "";
// ãã®ãã©ã°ã€ã³ãé©çšããããšãæç€º
message.AppliedPlugins.Add(this.Name);
// ãã以éã®ãã©ã°ã€ã³åŠçãå®è¡ãããªã
message.Terminated = true;
return true;
}
}
}
4-1-1. ã³ã³ã¹ãã©ã¯ã¿
ããŒã¹ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã«ãæååã®é åã§ããŒã¯ãŒãäžèŠ§ãæž¡ããŸãã
bool DoExecute(int keywordIndex, IBot bot, IMessage message)
4-1-2. - ããŒã¹ã¯ã©ã¹ã®
Execute
ããåŒã°ããŸãã - ã¡ã³ã·ã§ã³ã«ãªã£ãŠããªãå ŽåããããŒã¯ãŒããå«ãŸããŠããªãã£ãå Žåã
DoExecute
ã¯åŒã°ããŸããã int keywordIndex
ã¯ãã³ã³ã¹ãã©ã¯ã¿ã§æž¡ããããŒã¯ãŒãã®é åã®ãã¡ãããããããã®ã®ã€ã³ããã¯ã¹ã§ãã- ãã以å€ã¯éåžžã®
Execute
ãšåæ§ã«å®è£ ããŸãã
Nursery.Utility.IJSWrapper
4-2. - æååãJavaScriptãšããŠå®è¡ããããã®ãã«ããŒã¯ã©ã¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ãã
- ãã®å®è£
ãšããŠãçŸæç¹ã§ã¯Jintã䜿ã£ã
JintWrapper
ãååšããŸãã - å®éã®äœ¿çšäŸãšããŠã¯ã
SoundEffectPlugin
ãUserDefinedPlugin
ãåç §ããŠãã ããã
Nursery.Utility.Logger
4-3. - ãã°ã衚瀺ããããã®ãŠãŒãã£ãªãã£ã§ãã
- éåžžã®ãã°
Log
ãšããããã°ãã°DebugLog
ãçšæãããŠããŸãã - çŸæç¹ã§ã¯ããã°ã¯ãã ã³ã³ãœãŒã«ç»é¢ã«è¡šç€ºãããã ãã§ãã
4-4. ãã®ä»
Nursery.PluginInterface
ãšNursery.Utility
ã®ã³ãŒããåç
§ããŠãã ããã
5. åœéå
ãŸã翻蚳ã«ã€ããŠãäžèªããNurseryã§ã®ç¿»èš³ã®æ±ããçè§£ããŠãããŠãã ããã
- 翻蚳ã¯å¿ é ã§ã¯ãããŸããã
- ã³ãã³ãã®ãã«ããBotã®ã¡ãã»ãŒãžã¯ãåœéå察å¿ãè¡ãã®ã奜ãŸããã§ãããã
- ãã°ã«è¡šç€ºããã¡ãã»ãŒãžã¯ã»ãšãã©ã®å ŽåãŠãŒã¶ãŒã®ç®ã«è§Šããªãã®ã§ãåœéå察å¿ããå¿ èŠæ§ã¯é«ããããŸããããšã©ãŒã¡ãã»ãŒãžã翻蚳ããã°ãŠãŒã¶ãŒã®ãã©ãã«è§£æ±ºã®æå©ãã«ã¯ãªãã§ãããã
5-1. 翻蚳ãã¡ã€ã«ã®åäœã«ã€ããŠ
Nurseryã¯ãã©ã°ã€ã³ã·ã¹ãã ãå°å ¥ããŠããããã©ã°ã€ã³ã®dllã䜿ãã»äœ¿ããªãã¯ãŠãŒã¶ãŒã«ä»»ããããŠããŸãããã®ãããè€æ°ã®dllçšã®ç¿»èš³ããŒã¿ãã²ãšã€ã®ãã¡ã€ã«ã«ããã®ã¯éœåããããããŸããã
åºæ¬çã«ãdllãã¡ã€ã«1ã€ã«ã€ã.mo
ãã¡ã€ã«ã1ã€ã«ãªãããã«ããŸãããã
5-2. NGettextã®å°å ¥
åœéå察å¿ãè¡ãå Žåãèªäœãã©ã°ã€ã³ã®ãããžã§ã¯ãã«NGettextã远å ããŸããNuGetã§ãNurseryæ¬äœã䜿ã£ãŠããNGettextãšåãããŒãžã§ã³ãã€ã³ã¹ããŒã«ããŠãã ããã
T.cs
ã®ã³ããŒ
5-3. Nursery.Utility
ãããžã§ã¯ãå ã®T.cs
ããèªäœãã©ã°ã€ã³ã®ãããžã§ã¯ãã«ã³ããŒããŸãã- åå空éãä¿®æ£ããŸãã
DEFAULT_NAME
ã®å€ã倿ŽããŸããããã¯.mo
ãã¡ã€ã«ã®ååã«ãªãã®ã§ãèªäœãã©ã°ã€ã³ã®dllãšåãååã«ãããšããã§ãããã
5-4. 翻蚳ããæååã«é¢æ°ãé©çšãã
ãœãŒã¹ã³ãŒãäžã®æååã®äžããã翻蚳ããå¿ èŠã®ããæååãæ¢ãã颿°ãé©çšããŠãããŸãã
string text = "Some text.";
// â ãã®ããã«å€æŽ
string text = T._("Some text.");
string jp_text = "äœããã®æç« ã";
// â æ¥æ¬èªã®æç« ã¯ããã£ããè±èªã«å€æŽ
string jp_text = T._("Some text.");
5-5. 翻蚳ãã¡ã€ã«ãäœæã»ç·šéã»ãã«ããã
ãœãŒã¹ã³ãŒãããpoãã¡ã€ã«ãäœæããŸããïŒpoãã¡ã€ã«ã®äœæã»ç·šéæé ã¯poãã¡ã€ã«ç·šéãœããã«ãã£ãŠç°ãªããŸããåèªãã®è§£èª¬ãèªãã§ãã ãããïŒ
5-6. ãã«ãããmoãã¡ã€ã«ãé 眮ããŠå®è¡
ãã«ãããmoãã¡ã€ã«ã¯ãå®è¡ãã¡ã€ã«ã®ãã©ã«ãå
ã®locale\ja_JP\LC_MESSAGES
ã«é
眮ããŠãã ããã
5-7. ãã¡ã€ã«ã®é åž
- ãã©ã°ã€ã³ãé åžããå Žåã¯ãmoãã¡ã€ã«ãäžç·ã«é åžããŠãã ããã
- ãŠãŒã¶ãŒãã·ã¹ãã ã¡ãã»ãŒãžãã«ã¹ã¿ãã€ãºã§ãããããpoãã¡ã€ã«ïŒãããã¯potãã¡ã€ã«ïŒãé åžãããšããã§ãããã