Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CSChatBot-Core

CSChatBot is a bot framework for .NET Core devs looking to build a Telegram Bot

  • Fully Modular - Build your modules quickly and simply
  • Dynamic Database - Modules can easily modify / change the database schema
  • Simple to use - even comes with a module template that you can install into Visual Studio

Requirements

  • This solution is built in VS2017, though modules can be built in any version of VS
  • This is a native .NET application, not dotnet core, so must run on Windows - I plan to move to core soon

My overall goal with CSChatBot was to provide a fast, simple solution for other developers who didn't completely understand how Telegram Bot API works. - Para

Setup

You can either download a release build, or clone the repo locally and compile yourself. When you start the bot, it will guide you through some basic setup, like getting your bot token (from BotFather) and asking for any needed API keys.

Any modules you would like to use will need to be placed in the Addon Modules directory: root/Addon Modules/XKCD.dll for example.

Building your own module

There is a module template available in the releases. You can import than into VS, or just use the ModuleTemplate project included in the source.

Basic setup

If you choose to create your own project, rather than using the template, you will need to install the Telegram.Bot.Core library from Nuget

Install-Package Telegram.Bot.Core -Pre

In addition to this, you will also need to reference some of the libraries from the source:

  • DB
  • Logger
  • ModuleFramework

You primary module class must have the Module attribute, as well as a few basic information variables:

[Module(Author="My Name",Name="MyModule",Version="1.0")]

The constructor for this class must also accept the arguments as shown below:

publicMyModule(Instance db,Setting settings,TelegramBotClient bot)

There are a couple attributes available to register your commands with the bot - CallbackCommand and ChatCommand. You can check the TestModule in CSChatBot project for examples. The Triggers variable will bot what the bot watches for - you can have multiple triggers for one command.

Again, Please look at the sample modules included.

Group Settings

This is a new feature, and allows for dynamically adding / setting group configuration. You'll need to use the DB extensions to get the group, then you can get / set the setting you want. It also allows for int, bool, and string types. The last argument is the default value. If the field does not exist in the chatgroup table, it will be created with the default value.

varg=myDbInstance.GetGroupById(<groupid>)varsomeBool=g.GetSetting<bool>("SomeBool",myDbInstance,false);varsomeInt=g.GetSetting<int>("SomeInt",myDbInstance,0);varsomeString=g.GetSetting<string>("SomeString",myDbInstance,"");

Setting a group setting is very similar:

varsomeBool=true;varsomeInt=5;g.SetSetting<bool>("SomeBool",myDbInstance,false,someBool);varsuccess=g.SetSetting<int>("SomeInt",myDbInstance,0,someInt);

Chat Commands, Responses, and Inline Mode

All methods in your module should be constructed as such:

[ChatCommand(Triggers=new[]{"test"},DontSearchInline=true,HelpText="This is a sample command")]publicstaticCommandResponseTest(CommandEventArgsargs){//do somethingvarlength=args.Message.Text.Length;//return messagereturnnewCommandResponse($"Message: {args.Message.Text}\nLength: {length}");}

Triggers are the text a user can call the command with, both inline and in chat, using /command or !command. HelpText will show up when the user is looking through available modules, or when using inline searching.

There are a few other variables in the Attributes you can use:

VariableDescription
BotAdminOnlyOnly someone you have set as admin can use this command
GroupAdminOnlyOnly an admin of the group the command is run in can use this
DevOnlyOnly YOU can run it
InGroupOnlyBlocks from being used in PM
InPrivateOnlyCan only be run in PM, no groups
HideFromInlineCannot be used at all in inline mode
DontSearchInlineCan be used in inline mode ONLY when trigger is typed exactly

Keep in mind, if you don't specify one of the Inline mode hiding methods, the command WILL be run anytime a user types the bot name. If you have a command that might be API limited (like weather stuff), it would be a good idea to use DontSearchInline

As of commit #397d1529, CommandResponse can now also return a thumbnail and some more information. If the user doesn't enter the command directly (@botname ), they will get the command and HelpText in the results:

If they type the command in inline mode (@botname steam), they will get more information in the result:

Callback Commands and Menus

You can send inline button menus easily with the Menu object. A quick example:

varmenu=newMenu{Columns=2,Buttons=new[]{newInlineButton("My Text","trigger","some data"),newInlineButton("Grey Wolf Website",url:"http://github.com/GreyWolfDev")}};

This will create two side by side buttons. The first button will call the CallbackCommand with the trigger "trigger" and pass it "some data", while the second one will open github. Let's take a look at the CallbackCommand

[CallbackCommand(Trigger="trigger",HelpText="Some Command")]publicstaticCommandResponseSampleCommand(CallbackEventArgsargs){returnnewCommandResponse($"You pressed a button! The data behind it was: {args.Parameters}");}

In the menu above, when the user clicks the first button, the menu will go away and they will be sent the text "You pressed a button! The data behind it was: some data"

Modules

There are a few modules included with CSChatBot

ModuleDescriptionProject
AdminBasic admin commandsCSChatBot
BaseBasic commands, like !modulesCSChatBot
BasicSimple commands, like !lmgtfyCSChatBot
User FunctionsBasic user commands, like !pointsCSChatBot
MitsukuA chat bot users can chat with (INACTIVE / BROKEN)Cleverbot
MiscRandom stuff, like NSFW image detection and other thingsMisc
WeatherA sample module that gets the weather for the userWeatherModule
XKCDA module for searching XKCD of course :)XKCD
SteamCan pull profile information for yourself or othersSteam

About

A fully modular chat bot in C# using .NET Core

Topics

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CSChatBot-Core

CSChatBot is a bot framework for .NET Core devs looking to build a Telegram Bot

  • Fully Modular - Build your modules quickly and simply
  • Dynamic Database - Modules can easily modify / change the database schema
  • Simple to use - even comes with a module template that you can install into Visual Studio

Requirements

  • This solution is built in VS2017, though modules can be built in any version of VS
  • This is a native .NET application, not dotnet core, so must run on Windows - I plan to move to core soon

My overall goal with CSChatBot was to provide a fast, simple solution for other developers who didn't completely understand how Telegram Bot API works. - Para

Setup

You can either download a release build, or clone the repo locally and compile yourself. When you start the bot, it will guide you through some basic setup, like getting your bot token (from BotFather) and asking for any needed API keys.

Any modules you would like to use will need to be placed in the Addon Modules directory: root/Addon Modules/XKCD.dll for example.

Building your own module

There is a module template available in the releases. You can import than into VS, or just use the ModuleTemplate project included in the source.

Basic setup

If you choose to create your own project, rather than using the template, you will need to install the Telegram.Bot.Core library from Nuget

Install-Package Telegram.Bot.Core -Pre

In addition to this, you will also need to reference some of the libraries from the source:

  • DB
  • Logger
  • ModuleFramework

You primary module class must have the Module attribute, as well as a few basic information variables:

[Module(Author="My Name",Name="MyModule",Version="1.0")]

The constructor for this class must also accept the arguments as shown below:

publicMyModule(Instance db,Setting settings,TelegramBotClient bot)

There are a couple attributes available to register your commands with the bot - CallbackCommand and ChatCommand. You can check the TestModule in CSChatBot project for examples. The Triggers variable will bot what the bot watches for - you can have multiple triggers for one command.

Again, Please look at the sample modules included.

Group Settings

This is a new feature, and allows for dynamically adding / setting group configuration. You'll need to use the DB extensions to get the group, then you can get / set the setting you want. It also allows for int, bool, and string types. The last argument is the default value. If the field does not exist in the chatgroup table, it will be created with the default value.

varg=myDbInstance.GetGroupById(<groupid>)varsomeBool=g.GetSetting<bool>("SomeBool",myDbInstance,false);varsomeInt=g.GetSetting<int>("SomeInt",myDbInstance,0);varsomeString=g.GetSetting<string>("SomeString",myDbInstance,"");

Setting a group setting is very similar:

varsomeBool=true;varsomeInt=5;g.SetSetting<bool>("SomeBool",myDbInstance,false,someBool);varsuccess=g.SetSetting<int>("SomeInt",myDbInstance,0,someInt);

Chat Commands, Responses, and Inline Mode

All methods in your module should be constructed as such:

[ChatCommand(Triggers=new[]{"test"},DontSearchInline=true,HelpText="This is a sample command")]publicstaticCommandResponseTest(CommandEventArgsargs){//do somethingvarlength=args.Message.Text.Length;//return messagereturnnewCommandResponse($"Message: {args.Message.Text}\nLength: {length}");}

Triggers are the text a user can call the command with, both inline and in chat, using /command or !command. HelpText will show up when the user is looking through available modules, or when using inline searching.

There are a few other variables in the Attributes you can use:

VariableDescription
BotAdminOnlyOnly someone you have set as admin can use this command
GroupAdminOnlyOnly an admin of the group the command is run in can use this
DevOnlyOnly YOU can run it
InGroupOnlyBlocks from being used in PM
InPrivateOnlyCan only be run in PM, no groups
HideFromInlineCannot be used at all in inline mode
DontSearchInlineCan be used in inline mode ONLY when trigger is typed exactly

Keep in mind, if you don't specify one of the Inline mode hiding methods, the command WILL be run anytime a user types the bot name. If you have a command that might be API limited (like weather stuff), it would be a good idea to use DontSearchInline

As of commit #397d1529, CommandResponse can now also return a thumbnail and some more information. If the user doesn't enter the command directly (@botname ), they will get the command and HelpText in the results:

If they type the command in inline mode (@botname steam), they will get more information in the result:

Callback Commands and Menus

You can send inline button menus easily with the Menu object. A quick example:

varmenu=newMenu{Columns=2,Buttons=new[]{newInlineButton("My Text","trigger","some data"),newInlineButton("Grey Wolf Website",url:"http://github.com/GreyWolfDev")}};

This will create two side by side buttons. The first button will call the CallbackCommand with the trigger "trigger" and pass it "some data", while the second one will open github. Let's take a look at the CallbackCommand

[CallbackCommand(Trigger="trigger",HelpText="Some Command")]publicstaticCommandResponseSampleCommand(CallbackEventArgsargs){returnnewCommandResponse($"You pressed a button! The data behind it was: {args.Parameters}");}

In the menu above, when the user clicks the first button, the menu will go away and they will be sent the text "You pressed a button! The data behind it was: some data"

Modules

There are a few modules included with CSChatBot

ModuleDescriptionProject
AdminBasic admin commandsCSChatBot
BaseBasic commands, like !modulesCSChatBot
BasicSimple commands, like !lmgtfyCSChatBot
User FunctionsBasic user commands, like !pointsCSChatBot
MitsukuA chat bot users can chat with (INACTIVE / BROKEN)Cleverbot
MiscRandom stuff, like NSFW image detection and other thingsMisc
WeatherA sample module that gets the weather for the userWeatherModule
XKCDA module for searching XKCD of course :)XKCD
SteamCan pull profile information for yourself or othersSteam

About

A fully modular chat bot in C# using .NET Core

Topics

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CSChatBot-Core

CSChatBot is a bot framework for .NET Core devs looking to build a Telegram Bot

  • Fully Modular - Build your modules quickly and simply
  • Dynamic Database - Modules can easily modify / change the database schema
  • Simple to use - even comes with a module template that you can install into Visual Studio

Requirements

  • This solution is built in VS2017, though modules can be built in any version of VS
  • This is a native .NET application, not dotnet core, so must run on Windows - I plan to move to core soon

My overall goal with CSChatBot was to provide a fast, simple solution for other developers who didn't completely understand how Telegram Bot API works. - Para

Setup

You can either download a release build, or clone the repo locally and compile yourself. When you start the bot, it will guide you through some basic setup, like getting your bot token (from BotFather) and asking for any needed API keys.

Any modules you would like to use will need to be placed in the Addon Modules directory: root/Addon Modules/XKCD.dll for example.

Building your own module

There is a module template available in the releases. You can import than into VS, or just use the ModuleTemplate project included in the source.

Basic setup

If you choose to create your own project, rather than using the template, you will need to install the Telegram.Bot.Core library from Nuget

Install-Package Telegram.Bot.Core -Pre

In addition to this, you will also need to reference some of the libraries from the source:

  • DB
  • Logger
  • ModuleFramework

You primary module class must have the Module attribute, as well as a few basic information variables:

[Module(Author="My Name",Name="MyModule",Version="1.0")]

The constructor for this class must also accept the arguments as shown below:

publicMyModule(Instance db,Setting settings,TelegramBotClient bot)

There are a couple attributes available to register your commands with the bot - CallbackCommand and ChatCommand. You can check the TestModule in CSChatBot project for examples. The Triggers variable will bot what the bot watches for - you can have multiple triggers for one command.

Again, Please look at the sample modules included.

Group Settings

This is a new feature, and allows for dynamically adding / setting group configuration. You'll need to use the DB extensions to get the group, then you can get / set the setting you want. It also allows for int, bool, and string types. The last argument is the default value. If the field does not exist in the chatgroup table, it will be created with the default value.

varg=myDbInstance.GetGroupById(<groupid>)varsomeBool=g.GetSetting<bool>("SomeBool",myDbInstance,false);varsomeInt=g.GetSetting<int>("SomeInt",myDbInstance,0);varsomeString=g.GetSetting<string>("SomeString",myDbInstance,"");

Setting a group setting is very similar:

varsomeBool=true;varsomeInt=5;g.SetSetting<bool>("SomeBool",myDbInstance,false,someBool);varsuccess=g.SetSetting<int>("SomeInt",myDbInstance,0,someInt);

Chat Commands, Responses, and Inline Mode

All methods in your module should be constructed as such:

[ChatCommand(Triggers=new[]{"test"},DontSearchInline=true,HelpText="This is a sample command")]publicstaticCommandResponseTest(CommandEventArgsargs){//do somethingvarlength=args.Message.Text.Length;//return messagereturnnewCommandResponse($"Message: {args.Message.Text}\nLength: {length}");}

Triggers are the text a user can call the command with, both inline and in chat, using /command or !command. HelpText will show up when the user is looking through available modules, or when using inline searching.

There are a few other variables in the Attributes you can use:

VariableDescription
BotAdminOnlyOnly someone you have set as admin can use this command
GroupAdminOnlyOnly an admin of the group the command is run in can use this
DevOnlyOnly YOU can run it
InGroupOnlyBlocks from being used in PM
InPrivateOnlyCan only be run in PM, no groups
HideFromInlineCannot be used at all in inline mode
DontSearchInlineCan be used in inline mode ONLY when trigger is typed exactly

Keep in mind, if you don't specify one of the Inline mode hiding methods, the command WILL be run anytime a user types the bot name. If you have a command that might be API limited (like weather stuff), it would be a good idea to use DontSearchInline

As of commit #397d1529, CommandResponse can now also return a thumbnail and some more information. If the user doesn't enter the command directly (@botname ), they will get the command and HelpText in the results:

If they type the command in inline mode (@botname steam), they will get more information in the result:

Callback Commands and Menus

You can send inline button menus easily with the Menu object. A quick example:

varmenu=newMenu{Columns=2,Buttons=new[]{newInlineButton("My Text","trigger","some data"),newInlineButton("Grey Wolf Website",url:"http://github.com/GreyWolfDev")}};

This will create two side by side buttons. The first button will call the CallbackCommand with the trigger "trigger" and pass it "some data", while the second one will open github. Let's take a look at the CallbackCommand

[CallbackCommand(Trigger="trigger",HelpText="Some Command")]publicstaticCommandResponseSampleCommand(CallbackEventArgsargs){returnnewCommandResponse($"You pressed a button! The data behind it was: {args.Parameters}");}

In the menu above, when the user clicks the first button, the menu will go away and they will be sent the text "You pressed a button! The data behind it was: some data"

Modules

There are a few modules included with CSChatBot

ModuleDescriptionProject
AdminBasic admin commandsCSChatBot
BaseBasic commands, like !modulesCSChatBot
BasicSimple commands, like !lmgtfyCSChatBot
User FunctionsBasic user commands, like !pointsCSChatBot
MitsukuA chat bot users can chat with (INACTIVE / BROKEN)Cleverbot
MiscRandom stuff, like NSFW image detection and other thingsMisc
WeatherA sample module that gets the weather for the userWeatherModule
XKCDA module for searching XKCD of course :)XKCD
SteamCan pull profile information for yourself or othersSteam

About

A fully modular chat bot in C# using .NET Core

Topics

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CSChatBot-Core

CSChatBot is a bot framework for .NET Core devs looking to build a Telegram Bot

  • Fully Modular - Build your modules quickly and simply
  • Dynamic Database - Modules can easily modify / change the database schema
  • Simple to use - even comes with a module template that you can install into Visual Studio

Requirements

  • This solution is built in VS2017, though modules can be built in any version of VS
  • This is a native .NET application, not dotnet core, so must run on Windows - I plan to move to core soon

My overall goal with CSChatBot was to provide a fast, simple solution for other developers who didn't completely understand how Telegram Bot API works. - Para

Setup

You can either download a release build, or clone the repo locally and compile yourself. When you start the bot, it will guide you through some basic setup, like getting your bot token (from BotFather) and asking for any needed API keys.

Any modules you would like to use will need to be placed in the Addon Modules directory: root/Addon Modules/XKCD.dll for example.

Building your own module

There is a module template available in the releases. You can import than into VS, or just use the ModuleTemplate project included in the source.

Basic setup

If you choose to create your own project, rather than using the template, you will need to install the Telegram.Bot.Core library from Nuget

Install-Package Telegram.Bot.Core -Pre

In addition to this, you will also need to reference some of the libraries from the source:

  • DB
  • Logger
  • ModuleFramework

You primary module class must have the Module attribute, as well as a few basic information variables:

[Module(Author="My Name",Name="MyModule",Version="1.0")]

The constructor for this class must also accept the arguments as shown below:

publicMyModule(Instance db,Setting settings,TelegramBotClient bot)

There are a couple attributes available to register your commands with the bot - CallbackCommand and ChatCommand. You can check the TestModule in CSChatBot project for examples. The Triggers variable will bot what the bot watches for - you can have multiple triggers for one command.

Again, Please look at the sample modules included.

Group Settings

This is a new feature, and allows for dynamically adding / setting group configuration. You'll need to use the DB extensions to get the group, then you can get / set the setting you want. It also allows for int, bool, and string types. The last argument is the default value. If the field does not exist in the chatgroup table, it will be created with the default value.

varg=myDbInstance.GetGroupById(<groupid>)varsomeBool=g.GetSetting<bool>("SomeBool",myDbInstance,false);varsomeInt=g.GetSetting<int>("SomeInt",myDbInstance,0);varsomeString=g.GetSetting<string>("SomeString",myDbInstance,"");

Setting a group setting is very similar:

varsomeBool=true;varsomeInt=5;g.SetSetting<bool>("SomeBool",myDbInstance,false,someBool);varsuccess=g.SetSetting<int>("SomeInt",myDbInstance,0,someInt);

Chat Commands, Responses, and Inline Mode

All methods in your module should be constructed as such:

[ChatCommand(Triggers=new[]{"test"},DontSearchInline=true,HelpText="This is a sample command")]publicstaticCommandResponseTest(CommandEventArgsargs){//do somethingvarlength=args.Message.Text.Length;//return messagereturnnewCommandResponse($"Message: {args.Message.Text}\nLength: {length}");}

Triggers are the text a user can call the command with, both inline and in chat, using /command or !command. HelpText will show up when the user is looking through available modules, or when using inline searching.

There are a few other variables in the Attributes you can use:

VariableDescription
BotAdminOnlyOnly someone you have set as admin can use this command
GroupAdminOnlyOnly an admin of the group the command is run in can use this
DevOnlyOnly YOU can run it
InGroupOnlyBlocks from being used in PM
InPrivateOnlyCan only be run in PM, no groups
HideFromInlineCannot be used at all in inline mode
DontSearchInlineCan be used in inline mode ONLY when trigger is typed exactly

Keep in mind, if you don't specify one of the Inline mode hiding methods, the command WILL be run anytime a user types the bot name. If you have a command that might be API limited (like weather stuff), it would be a good idea to use DontSearchInline

As of commit #397d1529, CommandResponse can now also return a thumbnail and some more information. If the user doesn't enter the command directly (@botname ), they will get the command and HelpText in the results:

If they type the command in inline mode (@botname steam), they will get more information in the result:

Callback Commands and Menus

You can send inline button menus easily with the Menu object. A quick example:

varmenu=newMenu{Columns=2,Buttons=new[]{newInlineButton("My Text","trigger","some data"),newInlineButton("Grey Wolf Website",url:"http://github.com/GreyWolfDev")}};

This will create two side by side buttons. The first button will call the CallbackCommand with the trigger "trigger" and pass it "some data", while the second one will open github. Let's take a look at the CallbackCommand

[CallbackCommand(Trigger="trigger",HelpText="Some Command")]publicstaticCommandResponseSampleCommand(CallbackEventArgsargs){returnnewCommandResponse($"You pressed a button! The data behind it was: {args.Parameters}");}

In the menu above, when the user clicks the first button, the menu will go away and they will be sent the text "You pressed a button! The data behind it was: some data"

Modules

There are a few modules included with CSChatBot

ModuleDescriptionProject
AdminBasic admin commandsCSChatBot
BaseBasic commands, like !modulesCSChatBot
BasicSimple commands, like !lmgtfyCSChatBot
User FunctionsBasic user commands, like !pointsCSChatBot
MitsukuA chat bot users can chat with (INACTIVE / BROKEN)Cleverbot
MiscRandom stuff, like NSFW image detection and other thingsMisc
WeatherA sample module that gets the weather for the userWeatherModule
XKCDA module for searching XKCD of course :)XKCD
SteamCan pull profile information for yourself or othersSteam

About

A fully modular chat bot in C# using .NET Core

Topics

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CSChatBot-Core

CSChatBot is a bot framework for .NET Core devs looking to build a Telegram Bot

  • Fully Modular - Build your modules quickly and simply
  • Dynamic Database - Modules can easily modify / change the database schema
  • Simple to use - even comes with a module template that you can install into Visual Studio

Requirements

  • This solution is built in VS2017, though modules can be built in any version of VS
  • This is a native .NET application, not dotnet core, so must run on Windows - I plan to move to core soon

My overall goal with CSChatBot was to provide a fast, simple solution for other developers who didn't completely understand how Telegram Bot API works. - Para

Setup

You can either download a release build, or clone the repo locally and compile yourself. When you start the bot, it will guide you through some basic setup, like getting your bot token (from BotFather) and asking for any needed API keys.

Any modules you would like to use will need to be placed in the Addon Modules directory: root/Addon Modules/XKCD.dll for example.

Building your own module

There is a module template available in the releases. You can import than into VS, or just use the ModuleTemplate project included in the source.

Basic setup

If you choose to create your own project, rather than using the template, you will need to install the Telegram.Bot.Core library from Nuget

Install-Package Telegram.Bot.Core -Pre

In addition to this, you will also need to reference some of the libraries from the source:

  • DB
  • Logger
  • ModuleFramework

You primary module class must have the Module attribute, as well as a few basic information variables:

[Module(Author="My Name",Name="MyModule",Version="1.0")]

The constructor for this class must also accept the arguments as shown below:

publicMyModule(Instance db,Setting settings,TelegramBotClient bot)

There are a couple attributes available to register your commands with the bot - CallbackCommand and ChatCommand. You can check the TestModule in CSChatBot project for examples. The Triggers variable will bot what the bot watches for - you can have multiple triggers for one command.

Again, Please look at the sample modules included.

Group Settings

This is a new feature, and allows for dynamically adding / setting group configuration. You'll need to use the DB extensions to get the group, then you can get / set the setting you want. It also allows for int, bool, and string types. The last argument is the default value. If the field does not exist in the chatgroup table, it will be created with the default value.

varg=myDbInstance.GetGroupById(<groupid>)varsomeBool=g.GetSetting<bool>("SomeBool",myDbInstance,false);varsomeInt=g.GetSetting<int>("SomeInt",myDbInstance,0);varsomeString=g.GetSetting<string>("SomeString",myDbInstance,"");

Setting a group setting is very similar:

varsomeBool=true;varsomeInt=5;g.SetSetting<bool>("SomeBool",myDbInstance,false,someBool);varsuccess=g.SetSetting<int>("SomeInt",myDbInstance,0,someInt);

Chat Commands, Responses, and Inline Mode

All methods in your module should be constructed as such:

[ChatCommand(Triggers=new[]{"test"},DontSearchInline=true,HelpText="This is a sample command")]publicstaticCommandResponseTest(CommandEventArgsargs){//do somethingvarlength=args.Message.Text.Length;//return messagereturnnewCommandResponse($"Message: {args.Message.Text}\nLength: {length}");}

Triggers are the text a user can call the command with, both inline and in chat, using /command or !command. HelpText will show up when the user is looking through available modules, or when using inline searching.

There are a few other variables in the Attributes you can use:

VariableDescription
BotAdminOnlyOnly someone you have set as admin can use this command
GroupAdminOnlyOnly an admin of the group the command is run in can use this
DevOnlyOnly YOU can run it
InGroupOnlyBlocks from being used in PM
InPrivateOnlyCan only be run in PM, no groups
HideFromInlineCannot be used at all in inline mode
DontSearchInlineCan be used in inline mode ONLY when trigger is typed exactly

Keep in mind, if you don't specify one of the Inline mode hiding methods, the command WILL be run anytime a user types the bot name. If you have a command that might be API limited (like weather stuff), it would be a good idea to use DontSearchInline

As of commit #397d1529, CommandResponse can now also return a thumbnail and some more information. If the user doesn't enter the command directly (@botname ), they will get the command and HelpText in the results:

If they type the command in inline mode (@botname steam), they will get more information in the result:

Callback Commands and Menus

You can send inline button menus easily with the Menu object. A quick example:

varmenu=newMenu{Columns=2,Buttons=new[]{newInlineButton("My Text","trigger","some data"),newInlineButton("Grey Wolf Website",url:"http://github.com/GreyWolfDev")}};

This will create two side by side buttons. The first button will call the CallbackCommand with the trigger "trigger" and pass it "some data", while the second one will open github. Let's take a look at the CallbackCommand

[CallbackCommand(Trigger="trigger",HelpText="Some Command")]publicstaticCommandResponseSampleCommand(CallbackEventArgsargs){returnnewCommandResponse($"You pressed a button! The data behind it was: {args.Parameters}");}

In the menu above, when the user clicks the first button, the menu will go away and they will be sent the text "You pressed a button! The data behind it was: some data"

Modules

There are a few modules included with CSChatBot

ModuleDescriptionProject
AdminBasic admin commandsCSChatBot
BaseBasic commands, like !modulesCSChatBot
BasicSimple commands, like !lmgtfyCSChatBot
User FunctionsBasic user commands, like !pointsCSChatBot
MitsukuA chat bot users can chat with (INACTIVE / BROKEN)Cleverbot
MiscRandom stuff, like NSFW image detection and other thingsMisc
WeatherA sample module that gets the weather for the userWeatherModule
XKCDA module for searching XKCD of course :)XKCD
SteamCan pull profile information for yourself or othersSteam

About

A fully modular chat bot in C# using .NET Core

Topics

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CSChatBot-Core

CSChatBot is a bot framework for .NET Core devs looking to build a Telegram Bot

  • Fully Modular - Build your modules quickly and simply
  • Dynamic Database - Modules can easily modify / change the database schema
  • Simple to use - even comes with a module template that you can install into Visual Studio

Requirements

  • This solution is built in VS2017, though modules can be built in any version of VS
  • This is a native .NET application, not dotnet core, so must run on Windows - I plan to move to core soon

My overall goal with CSChatBot was to provide a fast, simple solution for other developers who didn't completely understand how Telegram Bot API works. - Para

Setup

You can either download a release build, or clone the repo locally and compile yourself. When you start the bot, it will guide you through some basic setup, like getting your bot token (from BotFather) and asking for any needed API keys.

Any modules you would like to use will need to be placed in the Addon Modules directory: root/Addon Modules/XKCD.dll for example.

Building your own module

There is a module template available in the releases. You can import than into VS, or just use the ModuleTemplate project included in the source.

Basic setup

If you choose to create your own project, rather than using the template, you will need to install the Telegram.Bot.Core library from Nuget

Install-Package Telegram.Bot.Core -Pre

In addition to this, you will also need to reference some of the libraries from the source:

  • DB
  • Logger
  • ModuleFramework

You primary module class must have the Module attribute, as well as a few basic information variables:

[Module(Author="My Name",Name="MyModule",Version="1.0")]

The constructor for this class must also accept the arguments as shown below:

publicMyModule(Instance db,Setting settings,TelegramBotClient bot)

There are a couple attributes available to register your commands with the bot - CallbackCommand and ChatCommand. You can check the TestModule in CSChatBot project for examples. The Triggers variable will bot what the bot watches for - you can have multiple triggers for one command.

Again, Please look at the sample modules included.

Group Settings

This is a new feature, and allows for dynamically adding / setting group configuration. You'll need to use the DB extensions to get the group, then you can get / set the setting you want. It also allows for int, bool, and string types. The last argument is the default value. If the field does not exist in the chatgroup table, it will be created with the default value.

varg=myDbInstance.GetGroupById(<groupid>)varsomeBool=g.GetSetting<bool>("SomeBool",myDbInstance,false);varsomeInt=g.GetSetting<int>("SomeInt",myDbInstance,0);varsomeString=g.GetSetting<string>("SomeString",myDbInstance,"");

Setting a group setting is very similar:

varsomeBool=true;varsomeInt=5;g.SetSetting<bool>("SomeBool",myDbInstance,false,someBool);varsuccess=g.SetSetting<int>("SomeInt",myDbInstance,0,someInt);

Chat Commands, Responses, and Inline Mode

All methods in your module should be constructed as such:

[ChatCommand(Triggers=new[]{"test"},DontSearchInline=true,HelpText="This is a sample command")]publicstaticCommandResponseTest(CommandEventArgsargs){//do somethingvarlength=args.Message.Text.Length;//return messagereturnnewCommandResponse($"Message: {args.Message.Text}\nLength: {length}");}

Triggers are the text a user can call the command with, both inline and in chat, using /command or !command. HelpText will show up when the user is looking through available modules, or when using inline searching.

There are a few other variables in the Attributes you can use:

VariableDescription
BotAdminOnlyOnly someone you have set as admin can use this command
GroupAdminOnlyOnly an admin of the group the command is run in can use this
DevOnlyOnly YOU can run it
InGroupOnlyBlocks from being used in PM
InPrivateOnlyCan only be run in PM, no groups
HideFromInlineCannot be used at all in inline mode
DontSearchInlineCan be used in inline mode ONLY when trigger is typed exactly

Keep in mind, if you don't specify one of the Inline mode hiding methods, the command WILL be run anytime a user types the bot name. If you have a command that might be API limited (like weather stuff), it would be a good idea to use DontSearchInline

As of commit #397d1529, CommandResponse can now also return a thumbnail and some more information. If the user doesn't enter the command directly (@botname ), they will get the command and HelpText in the results:

If they type the command in inline mode (@botname steam), they will get more information in the result:

Callback Commands and Menus

You can send inline button menus easily with the Menu object. A quick example:

varmenu=newMenu{Columns=2,Buttons=new[]{newInlineButton("My Text","trigger","some data"),newInlineButton("Grey Wolf Website",url:"http://github.com/GreyWolfDev")}};

This will create two side by side buttons. The first button will call the CallbackCommand with the trigger "trigger" and pass it "some data", while the second one will open github. Let's take a look at the CallbackCommand

[CallbackCommand(Trigger="trigger",HelpText="Some Command")]publicstaticCommandResponseSampleCommand(CallbackEventArgsargs){returnnewCommandResponse($"You pressed a button! The data behind it was: {args.Parameters}");}

In the menu above, when the user clicks the first button, the menu will go away and they will be sent the text "You pressed a button! The data behind it was: some data"

Modules

There are a few modules included with CSChatBot

ModuleDescriptionProject
AdminBasic admin commandsCSChatBot
BaseBasic commands, like !modulesCSChatBot
BasicSimple commands, like !lmgtfyCSChatBot
User FunctionsBasic user commands, like !pointsCSChatBot
MitsukuA chat bot users can chat with (INACTIVE / BROKEN)Cleverbot
MiscRandom stuff, like NSFW image detection and other thingsMisc
WeatherA sample module that gets the weather for the userWeatherModule
XKCDA module for searching XKCD of course :)XKCD
SteamCan pull profile information for yourself or othersSteam

About

A fully modular chat bot in C# using .NET Core

Topics

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CSChatBot-Core

CSChatBot is a bot framework for .NET Core devs looking to build a Telegram Bot

  • Fully Modular - Build your modules quickly and simply
  • Dynamic Database - Modules can easily modify / change the database schema
  • Simple to use - even comes with a module template that you can install into Visual Studio

Requirements

  • This solution is built in VS2017, though modules can be built in any version of VS
  • This is a native .NET application, not dotnet core, so must run on Windows - I plan to move to core soon

My overall goal with CSChatBot was to provide a fast, simple solution for other developers who didn't completely understand how Telegram Bot API works. - Para

Setup

You can either download a release build, or clone the repo locally and compile yourself. When you start the bot, it will guide you through some basic setup, like getting your bot token (from BotFather) and asking for any needed API keys.

Any modules you would like to use will need to be placed in the Addon Modules directory: root/Addon Modules/XKCD.dll for example.

Building your own module

There is a module template available in the releases. You can import than into VS, or just use the ModuleTemplate project included in the source.

Basic setup

If you choose to create your own project, rather than using the template, you will need to install the Telegram.Bot.Core library from Nuget

Install-Package Telegram.Bot.Core -Pre

In addition to this, you will also need to reference some of the libraries from the source:

  • DB
  • Logger
  • ModuleFramework

You primary module class must have the Module attribute, as well as a few basic information variables:

[Module(Author="My Name",Name="MyModule",Version="1.0")]

The constructor for this class must also accept the arguments as shown below:

publicMyModule(Instance db,Setting settings,TelegramBotClient bot)

There are a couple attributes available to register your commands with the bot - CallbackCommand and ChatCommand. You can check the TestModule in CSChatBot project for examples. The Triggers variable will bot what the bot watches for - you can have multiple triggers for one command.

Again, Please look at the sample modules included.

Group Settings

This is a new feature, and allows for dynamically adding / setting group configuration. You'll need to use the DB extensions to get the group, then you can get / set the setting you want. It also allows for int, bool, and string types. The last argument is the default value. If the field does not exist in the chatgroup table, it will be created with the default value.

varg=myDbInstance.GetGroupById(<groupid>)varsomeBool=g.GetSetting<bool>("SomeBool",myDbInstance,false);varsomeInt=g.GetSetting<int>("SomeInt",myDbInstance,0);varsomeString=g.GetSetting<string>("SomeString",myDbInstance,"");

Setting a group setting is very similar:

varsomeBool=true;varsomeInt=5;g.SetSetting<bool>("SomeBool",myDbInstance,false,someBool);varsuccess=g.SetSetting<int>("SomeInt",myDbInstance,0,someInt);

Chat Commands, Responses, and Inline Mode

All methods in your module should be constructed as such:

[ChatCommand(Triggers=new[]{"test"},DontSearchInline=true,HelpText="This is a sample command")]publicstaticCommandResponseTest(CommandEventArgsargs){//do somethingvarlength=args.Message.Text.Length;//return messagereturnnewCommandResponse($"Message: {args.Message.Text}\nLength: {length}");}

Triggers are the text a user can call the command with, both inline and in chat, using /command or !command. HelpText will show up when the user is looking through available modules, or when using inline searching.

There are a few other variables in the Attributes you can use:

VariableDescription
BotAdminOnlyOnly someone you have set as admin can use this command
GroupAdminOnlyOnly an admin of the group the command is run in can use this
DevOnlyOnly YOU can run it
InGroupOnlyBlocks from being used in PM
InPrivateOnlyCan only be run in PM, no groups
HideFromInlineCannot be used at all in inline mode
DontSearchInlineCan be used in inline mode ONLY when trigger is typed exactly

Keep in mind, if you don't specify one of the Inline mode hiding methods, the command WILL be run anytime a user types the bot name. If you have a command that might be API limited (like weather stuff), it would be a good idea to use DontSearchInline

As of commit #397d1529, CommandResponse can now also return a thumbnail and some more information. If the user doesn't enter the command directly (@botname ), they will get the command and HelpText in the results:

If they type the command in inline mode (@botname steam), they will get more information in the result:

Callback Commands and Menus

You can send inline button menus easily with the Menu object. A quick example:

varmenu=newMenu{Columns=2,Buttons=new[]{newInlineButton("My Text","trigger","some data"),newInlineButton("Grey Wolf Website",url:"http://github.com/GreyWolfDev")}};

This will create two side by side buttons. The first button will call the CallbackCommand with the trigger "trigger" and pass it "some data", while the second one will open github. Let's take a look at the CallbackCommand

[CallbackCommand(Trigger="trigger",HelpText="Some Command")]publicstaticCommandResponseSampleCommand(CallbackEventArgsargs){returnnewCommandResponse($"You pressed a button! The data behind it was: {args.Parameters}");}

In the menu above, when the user clicks the first button, the menu will go away and they will be sent the text "You pressed a button! The data behind it was: some data"

Modules

There are a few modules included with CSChatBot

ModuleDescriptionProject
AdminBasic admin commandsCSChatBot
BaseBasic commands, like !modulesCSChatBot
BasicSimple commands, like !lmgtfyCSChatBot
User FunctionsBasic user commands, like !pointsCSChatBot
MitsukuA chat bot users can chat with (INACTIVE / BROKEN)Cleverbot
MiscRandom stuff, like NSFW image detection and other thingsMisc
WeatherA sample module that gets the weather for the userWeatherModule
XKCDA module for searching XKCD of course :)XKCD
SteamCan pull profile information for yourself or othersSteam

About

A fully modular chat bot in C# using .NET Core

Topics

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CSChatBot-Core

CSChatBot is a bot framework for .NET Core devs looking to build a Telegram Bot

  • Fully Modular - Build your modules quickly and simply
  • Dynamic Database - Modules can easily modify / change the database schema
  • Simple to use - even comes with a module template that you can install into Visual Studio

Requirements

  • This solution is built in VS2017, though modules can be built in any version of VS
  • This is a native .NET application, not dotnet core, so must run on Windows - I plan to move to core soon

My overall goal with CSChatBot was to provide a fast, simple solution for other developers who didn't completely understand how Telegram Bot API works. - Para

Setup

You can either download a release build, or clone the repo locally and compile yourself. When you start the bot, it will guide you through some basic setup, like getting your bot token (from BotFather) and asking for any needed API keys.

Any modules you would like to use will need to be placed in the Addon Modules directory: root/Addon Modules/XKCD.dll for example.

Building your own module

There is a module template available in the releases. You can import than into VS, or just use the ModuleTemplate project included in the source.

Basic setup

If you choose to create your own project, rather than using the template, you will need to install the Telegram.Bot.Core library from Nuget

Install-Package Telegram.Bot.Core -Pre

In addition to this, you will also need to reference some of the libraries from the source:

  • DB
  • Logger
  • ModuleFramework

You primary module class must have the Module attribute, as well as a few basic information variables:

[Module(Author="My Name",Name="MyModule",Version="1.0")]

The constructor for this class must also accept the arguments as shown below:

publicMyModule(Instance db,Setting settings,TelegramBotClient bot)

There are a couple attributes available to register your commands with the bot - CallbackCommand and ChatCommand. You can check the TestModule in CSChatBot project for examples. The Triggers variable will bot what the bot watches for - you can have multiple triggers for one command.

Again, Please look at the sample modules included.

Group Settings

This is a new feature, and allows for dynamically adding / setting group configuration. You'll need to use the DB extensions to get the group, then you can get / set the setting you want. It also allows for int, bool, and string types. The last argument is the default value. If the field does not exist in the chatgroup table, it will be created with the default value.

varg=myDbInstance.GetGroupById(<groupid>)varsomeBool=g.GetSetting<bool>("SomeBool",myDbInstance,false);varsomeInt=g.GetSetting<int>("SomeInt",myDbInstance,0);varsomeString=g.GetSetting<string>("SomeString",myDbInstance,"");

Setting a group setting is very similar:

varsomeBool=true;varsomeInt=5;g.SetSetting<bool>("SomeBool",myDbInstance,false,someBool);varsuccess=g.SetSetting<int>("SomeInt",myDbInstance,0,someInt);

Chat Commands, Responses, and Inline Mode

All methods in your module should be constructed as such:

[ChatCommand(Triggers=new[]{"test"},DontSearchInline=true,HelpText="This is a sample command")]publicstaticCommandResponseTest(CommandEventArgsargs){//do somethingvarlength=args.Message.Text.Length;//return messagereturnnewCommandResponse($"Message: {args.Message.Text}\nLength: {length}");}

Triggers are the text a user can call the command with, both inline and in chat, using /command or !command. HelpText will show up when the user is looking through available modules, or when using inline searching.

There are a few other variables in the Attributes you can use:

VariableDescription
BotAdminOnlyOnly someone you have set as admin can use this command
GroupAdminOnlyOnly an admin of the group the command is run in can use this
DevOnlyOnly YOU can run it
InGroupOnlyBlocks from being used in PM
InPrivateOnlyCan only be run in PM, no groups
HideFromInlineCannot be used at all in inline mode
DontSearchInlineCan be used in inline mode ONLY when trigger is typed exactly

Keep in mind, if you don't specify one of the Inline mode hiding methods, the command WILL be run anytime a user types the bot name. If you have a command that might be API limited (like weather stuff), it would be a good idea to use DontSearchInline

As of commit #397d1529, CommandResponse can now also return a thumbnail and some more information. If the user doesn't enter the command directly (@botname ), they will get the command and HelpText in the results:

If they type the command in inline mode (@botname steam), they will get more information in the result:

Callback Commands and Menus

You can send inline button menus easily with the Menu object. A quick example:

varmenu=newMenu{Columns=2,Buttons=new[]{newInlineButton("My Text","trigger","some data"),newInlineButton("Grey Wolf Website",url:"http://github.com/GreyWolfDev")}};

This will create two side by side buttons. The first button will call the CallbackCommand with the trigger "trigger" and pass it "some data", while the second one will open github. Let's take a look at the CallbackCommand

[CallbackCommand(Trigger="trigger",HelpText="Some Command")]publicstaticCommandResponseSampleCommand(CallbackEventArgsargs){returnnewCommandResponse($"You pressed a button! The data behind it was: {args.Parameters}");}

In the menu above, when the user clicks the first button, the menu will go away and they will be sent the text "You pressed a button! The data behind it was: some data"

Modules

There are a few modules included with CSChatBot

ModuleDescriptionProject
AdminBasic admin commandsCSChatBot
BaseBasic commands, like !modulesCSChatBot
BasicSimple commands, like !lmgtfyCSChatBot
User FunctionsBasic user commands, like !pointsCSChatBot
MitsukuA chat bot users can chat with (INACTIVE / BROKEN)Cleverbot
MiscRandom stuff, like NSFW image detection and other thingsMisc
WeatherA sample module that gets the weather for the userWeatherModule
XKCDA module for searching XKCD of course :)XKCD
SteamCan pull profile information for yourself or othersSteam

About

A fully modular chat bot in C# using .NET Core

Topics

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages