This repository was archived by the owner on Aug 12, 2021. It is now read-only.

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

RustIRCBot

This is an irc bot in rust that loads its message responses dynamically from libraries at runtime.

It expects libraries to be in a folder called plugins in the working directory from which the binary is called.

Plugins should be named according with plaftorm standard convention, i.e. libpluginname.so on Linux.

The bot will translate a load request for 'pluginname' to the appropriate filename and load it.

Plugins are expected to be platform dynamic library files (.dll, .so, etc) which contain the following function signatures, where the client and message types are structs from the irc crate:

handle_message(client: &IrcClient, message: &Message) {...}

This is the function which will be called whenever the bot sees a message, and is the primary way for plugins to respond to commands.

initialize(client: &IrcClient) {...}

This function will be called when the plugin is loaded from disk, and is intended to provide for initial setup.

finalize() {...}

This function is called before a plugin is unloaded/reloaded, and is intended to provide for any necessary finalization.

print_desciption(client: &IrcClient, channel: &str) {...}

This function is meant to print a brief description of the plugin to the specified channel.

print_help(client: &IrcClient, channel: &str) {...}

This function is meant to print a detailed help message to the specified channel.

A simple example of a plugin can be found in the example_plugin directory.

More plugins for this bot can be found here.

Using this bot

This repository includes two crates.

The bot crate build the binary IRCBot. This binary can be run out of whatever directory you desire.

The example_plugin crate build a simple example plugin library. It, and all other libraries, should be placed in the plugins directory of the folder out of which the bot binary is run.

The bot is configured via the rust IRC crate standard configuration, config.toml, which should be placed in the same directory in which the bot binary is run. An example configuration file is available in this repo at config.toml.example. For a more detailed description of this file, please see the IRC crate documentations available on docs.rs.

Once connected, any bot owner (as specified in the above-mentioned config) can issue plugin management commands to the bot via private message or any channel in which the bot resides.

!load <plugin_name>

This command will make the bot load libplugin_name. from the plugins directory.

!reload

This command will make the bot reload all plugins, picking up any changes made to the libraries loaded from the plugins directory.

!goodbye

This command will make the bot gracefully exit, calling all finalize methods.

The example plugin implements a command.

!status

Which the bot will respond to, verifying that it is alive and seeing messages.

CS 510 Stuff

This was a project for CS 510: Rust Topics at Portland State University. The below relates mostly to this class.

Comments

The primary difficulty making this project work was figuring out how to dynamically load libraries in a useful way - being able to trigger load and reload actions via IRC being the goal. I spent some time attempting to build my own system for this, but ultimately settled on the dymanic_reload crate, as it had already solved a good deal of the problem I was tackling. From there, I simply had to build out an interface for plugin management and event passthrough.

The framework has a decent amount of error handling, which should ideally prevent most issues stemming from loading 'bad' libraries, however, loading unknown libraries at runtime IS an inherently unsafe operation, and should be treated as such. This bot is intended much more as a proof of concept and an opportunity for me to explore dynamic loading in Rust than as a real, production-ready IRC Bot core.

Features I would like to implement should I continue work on this project include plugin unloading (I was unable to find a simple method for handling this, it would likely require a name-> library lookup table), reloading specific plugins (the same difficulties as unloading apply here), more robust event passthrough, exposing more triggers and options to plugins, and better error handling and library safety (insomuch as this is possible with dynamic library loading.)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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
This repository was archived by the owner on Aug 12, 2021. It is now read-only.

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

RustIRCBot

This is an irc bot in rust that loads its message responses dynamically from libraries at runtime.

It expects libraries to be in a folder called plugins in the working directory from which the binary is called.

Plugins should be named according with plaftorm standard convention, i.e. libpluginname.so on Linux.

The bot will translate a load request for 'pluginname' to the appropriate filename and load it.

Plugins are expected to be platform dynamic library files (.dll, .so, etc) which contain the following function signatures, where the client and message types are structs from the irc crate:

handle_message(client: &IrcClient, message: &Message) {...}

This is the function which will be called whenever the bot sees a message, and is the primary way for plugins to respond to commands.

initialize(client: &IrcClient) {...}

This function will be called when the plugin is loaded from disk, and is intended to provide for initial setup.

finalize() {...}

This function is called before a plugin is unloaded/reloaded, and is intended to provide for any necessary finalization.

print_desciption(client: &IrcClient, channel: &str) {...}

This function is meant to print a brief description of the plugin to the specified channel.

print_help(client: &IrcClient, channel: &str) {...}

This function is meant to print a detailed help message to the specified channel.

A simple example of a plugin can be found in the example_plugin directory.

More plugins for this bot can be found here.

Using this bot

This repository includes two crates.

The bot crate build the binary IRCBot. This binary can be run out of whatever directory you desire.

The example_plugin crate build a simple example plugin library. It, and all other libraries, should be placed in the plugins directory of the folder out of which the bot binary is run.

The bot is configured via the rust IRC crate standard configuration, config.toml, which should be placed in the same directory in which the bot binary is run. An example configuration file is available in this repo at config.toml.example. For a more detailed description of this file, please see the IRC crate documentations available on docs.rs.

Once connected, any bot owner (as specified in the above-mentioned config) can issue plugin management commands to the bot via private message or any channel in which the bot resides.

!load <plugin_name>

This command will make the bot load libplugin_name. from the plugins directory.

!reload

This command will make the bot reload all plugins, picking up any changes made to the libraries loaded from the plugins directory.

!goodbye

This command will make the bot gracefully exit, calling all finalize methods.

The example plugin implements a command.

!status

Which the bot will respond to, verifying that it is alive and seeing messages.

CS 510 Stuff

This was a project for CS 510: Rust Topics at Portland State University. The below relates mostly to this class.

Comments

The primary difficulty making this project work was figuring out how to dynamically load libraries in a useful way - being able to trigger load and reload actions via IRC being the goal. I spent some time attempting to build my own system for this, but ultimately settled on the dymanic_reload crate, as it had already solved a good deal of the problem I was tackling. From there, I simply had to build out an interface for plugin management and event passthrough.

The framework has a decent amount of error handling, which should ideally prevent most issues stemming from loading 'bad' libraries, however, loading unknown libraries at runtime IS an inherently unsafe operation, and should be treated as such. This bot is intended much more as a proof of concept and an opportunity for me to explore dynamic loading in Rust than as a real, production-ready IRC Bot core.

Features I would like to implement should I continue work on this project include plugin unloading (I was unable to find a simple method for handling this, it would likely require a name-> library lookup table), reloading specific plugins (the same difficulties as unloading apply here), more robust event passthrough, exposing more triggers and options to plugins, and better error handling and library safety (insomuch as this is possible with dynamic library loading.)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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
This repository was archived by the owner on Aug 12, 2021. It is now read-only.

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

RustIRCBot

This is an irc bot in rust that loads its message responses dynamically from libraries at runtime.

It expects libraries to be in a folder called plugins in the working directory from which the binary is called.

Plugins should be named according with plaftorm standard convention, i.e. libpluginname.so on Linux.

The bot will translate a load request for 'pluginname' to the appropriate filename and load it.

Plugins are expected to be platform dynamic library files (.dll, .so, etc) which contain the following function signatures, where the client and message types are structs from the irc crate:

handle_message(client: &IrcClient, message: &Message) {...}

This is the function which will be called whenever the bot sees a message, and is the primary way for plugins to respond to commands.

initialize(client: &IrcClient) {...}

This function will be called when the plugin is loaded from disk, and is intended to provide for initial setup.

finalize() {...}

This function is called before a plugin is unloaded/reloaded, and is intended to provide for any necessary finalization.

print_desciption(client: &IrcClient, channel: &str) {...}

This function is meant to print a brief description of the plugin to the specified channel.

print_help(client: &IrcClient, channel: &str) {...}

This function is meant to print a detailed help message to the specified channel.

A simple example of a plugin can be found in the example_plugin directory.

More plugins for this bot can be found here.

Using this bot

This repository includes two crates.

The bot crate build the binary IRCBot. This binary can be run out of whatever directory you desire.

The example_plugin crate build a simple example plugin library. It, and all other libraries, should be placed in the plugins directory of the folder out of which the bot binary is run.

The bot is configured via the rust IRC crate standard configuration, config.toml, which should be placed in the same directory in which the bot binary is run. An example configuration file is available in this repo at config.toml.example. For a more detailed description of this file, please see the IRC crate documentations available on docs.rs.

Once connected, any bot owner (as specified in the above-mentioned config) can issue plugin management commands to the bot via private message or any channel in which the bot resides.

!load <plugin_name>

This command will make the bot load libplugin_name. from the plugins directory.

!reload

This command will make the bot reload all plugins, picking up any changes made to the libraries loaded from the plugins directory.

!goodbye

This command will make the bot gracefully exit, calling all finalize methods.

The example plugin implements a command.

!status

Which the bot will respond to, verifying that it is alive and seeing messages.

CS 510 Stuff

This was a project for CS 510: Rust Topics at Portland State University. The below relates mostly to this class.

Comments

The primary difficulty making this project work was figuring out how to dynamically load libraries in a useful way - being able to trigger load and reload actions via IRC being the goal. I spent some time attempting to build my own system for this, but ultimately settled on the dymanic_reload crate, as it had already solved a good deal of the problem I was tackling. From there, I simply had to build out an interface for plugin management and event passthrough.

The framework has a decent amount of error handling, which should ideally prevent most issues stemming from loading 'bad' libraries, however, loading unknown libraries at runtime IS an inherently unsafe operation, and should be treated as such. This bot is intended much more as a proof of concept and an opportunity for me to explore dynamic loading in Rust than as a real, production-ready IRC Bot core.

Features I would like to implement should I continue work on this project include plugin unloading (I was unable to find a simple method for handling this, it would likely require a name-> library lookup table), reloading specific plugins (the same difficulties as unloading apply here), more robust event passthrough, exposing more triggers and options to plugins, and better error handling and library safety (insomuch as this is possible with dynamic library loading.)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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 \u003e 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
This repository was archived by the owner on Aug 12, 2021. It is now read-only.

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

RustIRCBot

This is an irc bot in rust that loads its message responses dynamically from libraries at runtime.

It expects libraries to be in a folder called plugins in the working directory from which the binary is called.

Plugins should be named according with plaftorm standard convention, i.e. libpluginname.so on Linux.

The bot will translate a load request for 'pluginname' to the appropriate filename and load it.

Plugins are expected to be platform dynamic library files (.dll, .so, etc) which contain the following function signatures, where the client and message types are structs from the irc crate:

handle_message(client: &IrcClient, message: &Message) {...}

This is the function which will be called whenever the bot sees a message, and is the primary way for plugins to respond to commands.

initialize(client: &IrcClient) {...}

This function will be called when the plugin is loaded from disk, and is intended to provide for initial setup.

finalize() {...}

This function is called before a plugin is unloaded/reloaded, and is intended to provide for any necessary finalization.

print_desciption(client: &IrcClient, channel: &str) {...}

This function is meant to print a brief description of the plugin to the specified channel.

print_help(client: &IrcClient, channel: &str) {...}

This function is meant to print a detailed help message to the specified channel.

A simple example of a plugin can be found in the example_plugin directory.

More plugins for this bot can be found here.

Using this bot

This repository includes two crates.

The bot crate build the binary IRCBot. This binary can be run out of whatever directory you desire.

The example_plugin crate build a simple example plugin library. It, and all other libraries, should be placed in the plugins directory of the folder out of which the bot binary is run.

The bot is configured via the rust IRC crate standard configuration, config.toml, which should be placed in the same directory in which the bot binary is run. An example configuration file is available in this repo at config.toml.example. For a more detailed description of this file, please see the IRC crate documentations available on docs.rs.

Once connected, any bot owner (as specified in the above-mentioned config) can issue plugin management commands to the bot via private message or any channel in which the bot resides.

!load <plugin_name>

This command will make the bot load libplugin_name. from the plugins directory.

!reload

This command will make the bot reload all plugins, picking up any changes made to the libraries loaded from the plugins directory.

!goodbye

This command will make the bot gracefully exit, calling all finalize methods.

The example plugin implements a command.

!status

Which the bot will respond to, verifying that it is alive and seeing messages.

CS 510 Stuff

This was a project for CS 510: Rust Topics at Portland State University. The below relates mostly to this class.

Comments

The primary difficulty making this project work was figuring out how to dynamically load libraries in a useful way - being able to trigger load and reload actions via IRC being the goal. I spent some time attempting to build my own system for this, but ultimately settled on the dymanic_reload crate, as it had already solved a good deal of the problem I was tackling. From there, I simply had to build out an interface for plugin management and event passthrough.

The framework has a decent amount of error handling, which should ideally prevent most issues stemming from loading 'bad' libraries, however, loading unknown libraries at runtime IS an inherently unsafe operation, and should be treated as such. This bot is intended much more as a proof of concept and an opportunity for me to explore dynamic loading in Rust than as a real, production-ready IRC Bot core.

Features I would like to implement should I continue work on this project include plugin unloading (I was unable to find a simple method for handling this, it would likely require a name-> library lookup table), reloading specific plugins (the same difficulties as unloading apply here), more robust event passthrough, exposing more triggers and options to plugins, and better error handling and library safety (insomuch as this is possible with dynamic library loading.)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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
This repository was archived by the owner on Aug 12, 2021. It is now read-only.

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

RustIRCBot

This is an irc bot in rust that loads its message responses dynamically from libraries at runtime.

It expects libraries to be in a folder called plugins in the working directory from which the binary is called.

Plugins should be named according with plaftorm standard convention, i.e. libpluginname.so on Linux.

The bot will translate a load request for 'pluginname' to the appropriate filename and load it.

Plugins are expected to be platform dynamic library files (.dll, .so, etc) which contain the following function signatures, where the client and message types are structs from the irc crate:

handle_message(client: &IrcClient, message: &Message) {...}

This is the function which will be called whenever the bot sees a message, and is the primary way for plugins to respond to commands.

initialize(client: &IrcClient) {...}

This function will be called when the plugin is loaded from disk, and is intended to provide for initial setup.

finalize() {...}

This function is called before a plugin is unloaded/reloaded, and is intended to provide for any necessary finalization.

print_desciption(client: &IrcClient, channel: &str) {...}

This function is meant to print a brief description of the plugin to the specified channel.

print_help(client: &IrcClient, channel: &str) {...}

This function is meant to print a detailed help message to the specified channel.

A simple example of a plugin can be found in the example_plugin directory.

More plugins for this bot can be found here.

Using this bot

This repository includes two crates.

The bot crate build the binary IRCBot. This binary can be run out of whatever directory you desire.

The example_plugin crate build a simple example plugin library. It, and all other libraries, should be placed in the plugins directory of the folder out of which the bot binary is run.

The bot is configured via the rust IRC crate standard configuration, config.toml, which should be placed in the same directory in which the bot binary is run. An example configuration file is available in this repo at config.toml.example. For a more detailed description of this file, please see the IRC crate documentations available on docs.rs.

Once connected, any bot owner (as specified in the above-mentioned config) can issue plugin management commands to the bot via private message or any channel in which the bot resides.

!load <plugin_name>

This command will make the bot load libplugin_name. from the plugins directory.

!reload

This command will make the bot reload all plugins, picking up any changes made to the libraries loaded from the plugins directory.

!goodbye

This command will make the bot gracefully exit, calling all finalize methods.

The example plugin implements a command.

!status

Which the bot will respond to, verifying that it is alive and seeing messages.

CS 510 Stuff

This was a project for CS 510: Rust Topics at Portland State University. The below relates mostly to this class.

Comments

The primary difficulty making this project work was figuring out how to dynamically load libraries in a useful way - being able to trigger load and reload actions via IRC being the goal. I spent some time attempting to build my own system for this, but ultimately settled on the dymanic_reload crate, as it had already solved a good deal of the problem I was tackling. From there, I simply had to build out an interface for plugin management and event passthrough.

The framework has a decent amount of error handling, which should ideally prevent most issues stemming from loading 'bad' libraries, however, loading unknown libraries at runtime IS an inherently unsafe operation, and should be treated as such. This bot is intended much more as a proof of concept and an opportunity for me to explore dynamic loading in Rust than as a real, production-ready IRC Bot core.

Features I would like to implement should I continue work on this project include plugin unloading (I was unable to find a simple method for handling this, it would likely require a name-> library lookup table), reloading specific plugins (the same difficulties as unloading apply here), more robust event passthrough, exposing more triggers and options to plugins, and better error handling and library safety (insomuch as this is possible with dynamic library loading.)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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
This repository was archived by the owner on Aug 12, 2021. It is now read-only.

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

RustIRCBot

This is an irc bot in rust that loads its message responses dynamically from libraries at runtime.

It expects libraries to be in a folder called plugins in the working directory from which the binary is called.

Plugins should be named according with plaftorm standard convention, i.e. libpluginname.so on Linux.

The bot will translate a load request for 'pluginname' to the appropriate filename and load it.

Plugins are expected to be platform dynamic library files (.dll, .so, etc) which contain the following function signatures, where the client and message types are structs from the irc crate:

handle_message(client: &IrcClient, message: &Message) {...}

This is the function which will be called whenever the bot sees a message, and is the primary way for plugins to respond to commands.

initialize(client: &IrcClient) {...}

This function will be called when the plugin is loaded from disk, and is intended to provide for initial setup.

finalize() {...}

This function is called before a plugin is unloaded/reloaded, and is intended to provide for any necessary finalization.

print_desciption(client: &IrcClient, channel: &str) {...}

This function is meant to print a brief description of the plugin to the specified channel.

print_help(client: &IrcClient, channel: &str) {...}

This function is meant to print a detailed help message to the specified channel.

A simple example of a plugin can be found in the example_plugin directory.

More plugins for this bot can be found here.

Using this bot

This repository includes two crates.

The bot crate build the binary IRCBot. This binary can be run out of whatever directory you desire.

The example_plugin crate build a simple example plugin library. It, and all other libraries, should be placed in the plugins directory of the folder out of which the bot binary is run.

The bot is configured via the rust IRC crate standard configuration, config.toml, which should be placed in the same directory in which the bot binary is run. An example configuration file is available in this repo at config.toml.example. For a more detailed description of this file, please see the IRC crate documentations available on docs.rs.

Once connected, any bot owner (as specified in the above-mentioned config) can issue plugin management commands to the bot via private message or any channel in which the bot resides.

!load <plugin_name>

This command will make the bot load libplugin_name. from the plugins directory.

!reload

This command will make the bot reload all plugins, picking up any changes made to the libraries loaded from the plugins directory.

!goodbye

This command will make the bot gracefully exit, calling all finalize methods.

The example plugin implements a command.

!status

Which the bot will respond to, verifying that it is alive and seeing messages.

CS 510 Stuff

This was a project for CS 510: Rust Topics at Portland State University. The below relates mostly to this class.

Comments

The primary difficulty making this project work was figuring out how to dynamically load libraries in a useful way - being able to trigger load and reload actions via IRC being the goal. I spent some time attempting to build my own system for this, but ultimately settled on the dymanic_reload crate, as it had already solved a good deal of the problem I was tackling. From there, I simply had to build out an interface for plugin management and event passthrough.

The framework has a decent amount of error handling, which should ideally prevent most issues stemming from loading 'bad' libraries, however, loading unknown libraries at runtime IS an inherently unsafe operation, and should be treated as such. This bot is intended much more as a proof of concept and an opportunity for me to explore dynamic loading in Rust than as a real, production-ready IRC Bot core.

Features I would like to implement should I continue work on this project include plugin unloading (I was unable to find a simple method for handling this, it would likely require a name-> library lookup table), reloading specific plugins (the same difficulties as unloading apply here), more robust event passthrough, exposing more triggers and options to plugins, and better error handling and library safety (insomuch as this is possible with dynamic library loading.)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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
This repository was archived by the owner on Aug 12, 2021. It is now read-only.

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

RustIRCBot

This is an irc bot in rust that loads its message responses dynamically from libraries at runtime.

It expects libraries to be in a folder called plugins in the working directory from which the binary is called.

Plugins should be named according with plaftorm standard convention, i.e. libpluginname.so on Linux.

The bot will translate a load request for 'pluginname' to the appropriate filename and load it.

Plugins are expected to be platform dynamic library files (.dll, .so, etc) which contain the following function signatures, where the client and message types are structs from the irc crate:

handle_message(client: &IrcClient, message: &Message) {...}

This is the function which will be called whenever the bot sees a message, and is the primary way for plugins to respond to commands.

initialize(client: &IrcClient) {...}

This function will be called when the plugin is loaded from disk, and is intended to provide for initial setup.

finalize() {...}

This function is called before a plugin is unloaded/reloaded, and is intended to provide for any necessary finalization.

print_desciption(client: &IrcClient, channel: &str) {...}

This function is meant to print a brief description of the plugin to the specified channel.

print_help(client: &IrcClient, channel: &str) {...}

This function is meant to print a detailed help message to the specified channel.

A simple example of a plugin can be found in the example_plugin directory.

More plugins for this bot can be found here.

Using this bot

This repository includes two crates.

The bot crate build the binary IRCBot. This binary can be run out of whatever directory you desire.

The example_plugin crate build a simple example plugin library. It, and all other libraries, should be placed in the plugins directory of the folder out of which the bot binary is run.

The bot is configured via the rust IRC crate standard configuration, config.toml, which should be placed in the same directory in which the bot binary is run. An example configuration file is available in this repo at config.toml.example. For a more detailed description of this file, please see the IRC crate documentations available on docs.rs.

Once connected, any bot owner (as specified in the above-mentioned config) can issue plugin management commands to the bot via private message or any channel in which the bot resides.

!load <plugin_name>

This command will make the bot load libplugin_name. from the plugins directory.

!reload

This command will make the bot reload all plugins, picking up any changes made to the libraries loaded from the plugins directory.

!goodbye

This command will make the bot gracefully exit, calling all finalize methods.

The example plugin implements a command.

!status

Which the bot will respond to, verifying that it is alive and seeing messages.

CS 510 Stuff

This was a project for CS 510: Rust Topics at Portland State University. The below relates mostly to this class.

Comments

The primary difficulty making this project work was figuring out how to dynamically load libraries in a useful way - being able to trigger load and reload actions via IRC being the goal. I spent some time attempting to build my own system for this, but ultimately settled on the dymanic_reload crate, as it had already solved a good deal of the problem I was tackling. From there, I simply had to build out an interface for plugin management and event passthrough.

The framework has a decent amount of error handling, which should ideally prevent most issues stemming from loading 'bad' libraries, however, loading unknown libraries at runtime IS an inherently unsafe operation, and should be treated as such. This bot is intended much more as a proof of concept and an opportunity for me to explore dynamic loading in Rust than as a real, production-ready IRC Bot core.

Features I would like to implement should I continue work on this project include plugin unloading (I was unable to find a simple method for handling this, it would likely require a name-> library lookup table), reloading specific plugins (the same difficulties as unloading apply here), more robust event passthrough, exposing more triggers and options to plugins, and better error handling and library safety (insomuch as this is possible with dynamic library loading.)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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
This repository was archived by the owner on Aug 12, 2021. It is now read-only.

Latest commit

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

RustIRCBot

This is an irc bot in rust that loads its message responses dynamically from libraries at runtime.

It expects libraries to be in a folder called plugins in the working directory from which the binary is called.

Plugins should be named according with plaftorm standard convention, i.e. libpluginname.so on Linux.

The bot will translate a load request for 'pluginname' to the appropriate filename and load it.

Plugins are expected to be platform dynamic library files (.dll, .so, etc) which contain the following function signatures, where the client and message types are structs from the irc crate:

handle_message(client: &IrcClient, message: &Message) {...}

This is the function which will be called whenever the bot sees a message, and is the primary way for plugins to respond to commands.

initialize(client: &IrcClient) {...}

This function will be called when the plugin is loaded from disk, and is intended to provide for initial setup.

finalize() {...}

This function is called before a plugin is unloaded/reloaded, and is intended to provide for any necessary finalization.

print_desciption(client: &IrcClient, channel: &str) {...}

This function is meant to print a brief description of the plugin to the specified channel.

print_help(client: &IrcClient, channel: &str) {...}

This function is meant to print a detailed help message to the specified channel.

A simple example of a plugin can be found in the example_plugin directory.

More plugins for this bot can be found here.

Using this bot

This repository includes two crates.

The bot crate build the binary IRCBot. This binary can be run out of whatever directory you desire.

The example_plugin crate build a simple example plugin library. It, and all other libraries, should be placed in the plugins directory of the folder out of which the bot binary is run.

The bot is configured via the rust IRC crate standard configuration, config.toml, which should be placed in the same directory in which the bot binary is run. An example configuration file is available in this repo at config.toml.example. For a more detailed description of this file, please see the IRC crate documentations available on docs.rs.

Once connected, any bot owner (as specified in the above-mentioned config) can issue plugin management commands to the bot via private message or any channel in which the bot resides.

!load <plugin_name>

This command will make the bot load libplugin_name. from the plugins directory.

!reload

This command will make the bot reload all plugins, picking up any changes made to the libraries loaded from the plugins directory.

!goodbye

This command will make the bot gracefully exit, calling all finalize methods.

The example plugin implements a command.

!status

Which the bot will respond to, verifying that it is alive and seeing messages.

CS 510 Stuff

This was a project for CS 510: Rust Topics at Portland State University. The below relates mostly to this class.

Comments

The primary difficulty making this project work was figuring out how to dynamically load libraries in a useful way - being able to trigger load and reload actions via IRC being the goal. I spent some time attempting to build my own system for this, but ultimately settled on the dymanic_reload crate, as it had already solved a good deal of the problem I was tackling. From there, I simply had to build out an interface for plugin management and event passthrough.

The framework has a decent amount of error handling, which should ideally prevent most issues stemming from loading 'bad' libraries, however, loading unknown libraries at runtime IS an inherently unsafe operation, and should be treated as such. This bot is intended much more as a proof of concept and an opportunity for me to explore dynamic loading in Rust than as a real, production-ready IRC Bot core.

Features I would like to implement should I continue work on this project include plugin unloading (I was unable to find a simple method for handling this, it would likely require a name-> library lookup table), reloading specific plugins (the same difficulties as unloading apply here), more robust event passthrough, exposing more triggers and options to plugins, and better error handling and library safety (insomuch as this is possible with dynamic library loading.)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages