Skip to content

Repository files navigation

Volt IconVolt

Formerly HTTPServer

Volt is an hyper-powerful integrated website solution for PocketMine. Driven by Handlebars and pthreads, volt is an extensive webserver. Volt's dependencies are managed using Miner.

What's changing in v3.0.0?

  • Name. HTTPServer is now volt. Why? I thought carefully about this one and I figured that "HTTPServer" did not represent the project correctly.
  • Threading. Volt is now better at threading. Every request is run by a worker in a pool. This allows multiple requests to be processed in parallel.
  • Templating. Now Volt is driven by Handlebars for high speeds and extreme customization.
  • API. The API has been entirely rewritten to be more fun to use. It is much more logical and powerful.

The /volt command

The /volt command allows interaction with the API and the server itself. It doesn't have many features right now, but I am always open to suggestions for new ones.

  • /volt api list - Will list plugins that are using the API
  • /volt api getsub - Will list what subscription every plugin on the server holds in the Volt API

Volt API

The API is still tentative and might undergo some large structural changes before its release, so don't get too attached to it. The API centralizes on WebsiteData objects which are magical objects that allow interaction with the server. These objects mimic arrays by implementing \ArrayAccess, \Countable, and \IteratorAggregate. The API also exposes DynamicPage for registering pages, ServerThread for direct interaction with the server and HandlebarsHelper for injecting code into handlebars.

API Security

API subscription levels

Volt's API will offer features which can cause harm to the PocketMine instance. For example, using a HandlebarsHelper can easily cause a segfault or a memory leak if not used correctly. In order to combat this, Volt provides an API subscription system. There are five subscription levels.

  • micro (Default) - DynamicPage and WebsiteData
  • deci- Not currently used
  • kilo - HandlebarsHelper
  • mega - ServerThread
  • peta - Not currently used

You can specify an API level to consume in the base class of your plugin using a doc comment on the class. You will have access to all lower levels as well. The following comment is used on the Volt main class

/** * Class Volt * @package volt * @volt-api peta */class Volt extends PluginBase{

Note If you want to save space you can remove the first two lines of the comment.

Internal method protection

Some methods are protected by Volt for API security. If you attempt to access one of these you will get thrown an InternalMethodException.

API Identification

In an optimal setting you should identify yourself to Volt. This will allow Volt to create logs of your API usage. Identification is recommended for all interactions and is required for all interactions except WebsiteData. There are three options for identification

  • PluginBase (Recommended)
  • Plugin name
  • Auto-detect (Not recommended)
MonitoredWebsiteData
/* Option #1 (Recommended) */$data = new \volt\api\MonitoredWebsiteData($this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\MonitoredWebsiteData("PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\MonitoredWebsiteData(); //Called from within a PluginBase, and requires class name to equal plugin name
DynamicPage
/* Option #1 (Recommended) */$data = new \volt\api\DynamicPage("/page", $this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\DynamicPage("/page", "PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\DynamicPage("/page"); //Called from within a PluginBase, and requires class name to equal plugin name

If an identification request fails a volt\exception\PluginIdentificationException will be thrown.

Setting and getting values with WebsiteData or MonitoredWebsiteData

Once you have a WebsiteData object, you get a link to the global scope of handlebars variables. It is highly recommended to put all your variables in a namespace for your plugin, this helps avoid collisions.

$data = new \volt\WebsiteData(); //We are using anon$data["foo"] = ["1", "2", "3"]; // not loggedvar_dump($data["foo"]); // not logged$data = new \volt\MonitoredWebsiteData($this); // We are using identified, $this is a \pocketmine\plugin\Plugin$data["bar"] = ["1", "2", "3"]; // loggedvar_dump($data["bar"]); // logged

Dynamic Page Registration with DynamicPage

To ease plugin installation, pages can be dynamically registered into Volt. This feature is still experimental and may be expanded upon in a future release.

$page = new \volt\api\DynamicPage("/hello", $this); // For second param see identified. $page("This is the content"); //Page is now available at /hello and will display "This is the content"

Handlebars Helpers with HandlebarsHelper

Helpers allow custom features to be added to the handlebars language. Helpers are callable and should be anonymous functions. Due to the threaded nature of Volt, helpers are unstable and can easily cause issues. In order to use helpers, you will need to set your @volt-api to kilo or higher.

Direct thread access with ServerThread

Sometimes the API doesn't cut it and you might need direct access the the server thread. You can do this using a ServerThread object. These objects will forward all function calls to the volt server. To use ServerThread, you will need to set your @volt-apito mega or higher.

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - falkirks/Volt: A painless web server for PocketMine-MP · GitHub
Skip to content

Repository files navigation

Volt IconVolt

Formerly HTTPServer

Volt is an hyper-powerful integrated website solution for PocketMine. Driven by Handlebars and pthreads, volt is an extensive webserver. Volt's dependencies are managed using Miner.

What's changing in v3.0.0?

  • Name. HTTPServer is now volt. Why? I thought carefully about this one and I figured that "HTTPServer" did not represent the project correctly.
  • Threading. Volt is now better at threading. Every request is run by a worker in a pool. This allows multiple requests to be processed in parallel.
  • Templating. Now Volt is driven by Handlebars for high speeds and extreme customization.
  • API. The API has been entirely rewritten to be more fun to use. It is much more logical and powerful.

The /volt command

The /volt command allows interaction with the API and the server itself. It doesn't have many features right now, but I am always open to suggestions for new ones.

  • /volt api list - Will list plugins that are using the API
  • /volt api getsub - Will list what subscription every plugin on the server holds in the Volt API

Volt API

The API is still tentative and might undergo some large structural changes before its release, so don't get too attached to it. The API centralizes on WebsiteData objects which are magical objects that allow interaction with the server. These objects mimic arrays by implementing \ArrayAccess, \Countable, and \IteratorAggregate. The API also exposes DynamicPage for registering pages, ServerThread for direct interaction with the server and HandlebarsHelper for injecting code into handlebars.

API Security

API subscription levels

Volt's API will offer features which can cause harm to the PocketMine instance. For example, using a HandlebarsHelper can easily cause a segfault or a memory leak if not used correctly. In order to combat this, Volt provides an API subscription system. There are five subscription levels.

  • micro (Default) - DynamicPage and WebsiteData
  • deci- Not currently used
  • kilo - HandlebarsHelper
  • mega - ServerThread
  • peta - Not currently used

You can specify an API level to consume in the base class of your plugin using a doc comment on the class. You will have access to all lower levels as well. The following comment is used on the Volt main class

/** * Class Volt * @package volt * @volt-api peta */class Volt extends PluginBase{

Note If you want to save space you can remove the first two lines of the comment.

Internal method protection

Some methods are protected by Volt for API security. If you attempt to access one of these you will get thrown an InternalMethodException.

API Identification

In an optimal setting you should identify yourself to Volt. This will allow Volt to create logs of your API usage. Identification is recommended for all interactions and is required for all interactions except WebsiteData. There are three options for identification

  • PluginBase (Recommended)
  • Plugin name
  • Auto-detect (Not recommended)
MonitoredWebsiteData
/* Option #1 (Recommended) */$data = new \volt\api\MonitoredWebsiteData($this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\MonitoredWebsiteData("PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\MonitoredWebsiteData(); //Called from within a PluginBase, and requires class name to equal plugin name
DynamicPage
/* Option #1 (Recommended) */$data = new \volt\api\DynamicPage("/page", $this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\DynamicPage("/page", "PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\DynamicPage("/page"); //Called from within a PluginBase, and requires class name to equal plugin name

If an identification request fails a volt\exception\PluginIdentificationException will be thrown.

Setting and getting values with WebsiteData or MonitoredWebsiteData

Once you have a WebsiteData object, you get a link to the global scope of handlebars variables. It is highly recommended to put all your variables in a namespace for your plugin, this helps avoid collisions.

$data = new \volt\WebsiteData(); //We are using anon$data["foo"] = ["1", "2", "3"]; // not loggedvar_dump($data["foo"]); // not logged$data = new \volt\MonitoredWebsiteData($this); // We are using identified, $this is a \pocketmine\plugin\Plugin$data["bar"] = ["1", "2", "3"]; // loggedvar_dump($data["bar"]); // logged

Dynamic Page Registration with DynamicPage

To ease plugin installation, pages can be dynamically registered into Volt. This feature is still experimental and may be expanded upon in a future release.

$page = new \volt\api\DynamicPage("/hello", $this); // For second param see identified. $page("This is the content"); //Page is now available at /hello and will display "This is the content"

Handlebars Helpers with HandlebarsHelper

Helpers allow custom features to be added to the handlebars language. Helpers are callable and should be anonymous functions. Due to the threaded nature of Volt, helpers are unstable and can easily cause issues. In order to use helpers, you will need to set your @volt-api to kilo or higher.

Direct thread access with ServerThread

Sometimes the API doesn't cut it and you might need direct access the the server thread. You can do this using a ServerThread object. These objects will forward all function calls to the volt server. To use ServerThread, you will need to set your @volt-apito mega or higher.

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Volt IconVolt

Formerly HTTPServer

Volt is an hyper-powerful integrated website solution for PocketMine. Driven by Handlebars and pthreads, volt is an extensive webserver. Volt's dependencies are managed using Miner.

What's changing in v3.0.0?

  • Name. HTTPServer is now volt. Why? I thought carefully about this one and I figured that "HTTPServer" did not represent the project correctly.
  • Threading. Volt is now better at threading. Every request is run by a worker in a pool. This allows multiple requests to be processed in parallel.
  • Templating. Now Volt is driven by Handlebars for high speeds and extreme customization.
  • API. The API has been entirely rewritten to be more fun to use. It is much more logical and powerful.

The /volt command

The /volt command allows interaction with the API and the server itself. It doesn't have many features right now, but I am always open to suggestions for new ones.

  • /volt api list - Will list plugins that are using the API
  • /volt api getsub - Will list what subscription every plugin on the server holds in the Volt API

Volt API

The API is still tentative and might undergo some large structural changes before its release, so don't get too attached to it. The API centralizes on WebsiteData objects which are magical objects that allow interaction with the server. These objects mimic arrays by implementing \ArrayAccess, \Countable, and \IteratorAggregate. The API also exposes DynamicPage for registering pages, ServerThread for direct interaction with the server and HandlebarsHelper for injecting code into handlebars.

API Security

API subscription levels

Volt's API will offer features which can cause harm to the PocketMine instance. For example, using a HandlebarsHelper can easily cause a segfault or a memory leak if not used correctly. In order to combat this, Volt provides an API subscription system. There are five subscription levels.

  • micro (Default) - DynamicPage and WebsiteData
  • deci- Not currently used
  • kilo - HandlebarsHelper
  • mega - ServerThread
  • peta - Not currently used

You can specify an API level to consume in the base class of your plugin using a doc comment on the class. You will have access to all lower levels as well. The following comment is used on the Volt main class

/** * Class Volt * @package volt * @volt-api peta */class Volt extends PluginBase{

Note If you want to save space you can remove the first two lines of the comment.

Internal method protection

Some methods are protected by Volt for API security. If you attempt to access one of these you will get thrown an InternalMethodException.

API Identification

In an optimal setting you should identify yourself to Volt. This will allow Volt to create logs of your API usage. Identification is recommended for all interactions and is required for all interactions except WebsiteData. There are three options for identification

  • PluginBase (Recommended)
  • Plugin name
  • Auto-detect (Not recommended)
MonitoredWebsiteData
/* Option #1 (Recommended) */$data = new \volt\api\MonitoredWebsiteData($this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\MonitoredWebsiteData("PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\MonitoredWebsiteData(); //Called from within a PluginBase, and requires class name to equal plugin name
DynamicPage
/* Option #1 (Recommended) */$data = new \volt\api\DynamicPage("/page", $this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\DynamicPage("/page", "PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\DynamicPage("/page"); //Called from within a PluginBase, and requires class name to equal plugin name

If an identification request fails a volt\exception\PluginIdentificationException will be thrown.

Setting and getting values with WebsiteData or MonitoredWebsiteData

Once you have a WebsiteData object, you get a link to the global scope of handlebars variables. It is highly recommended to put all your variables in a namespace for your plugin, this helps avoid collisions.

$data = new \volt\WebsiteData(); //We are using anon$data["foo"] = ["1", "2", "3"]; // not loggedvar_dump($data["foo"]); // not logged$data = new \volt\MonitoredWebsiteData($this); // We are using identified, $this is a \pocketmine\plugin\Plugin$data["bar"] = ["1", "2", "3"]; // loggedvar_dump($data["bar"]); // logged

Dynamic Page Registration with DynamicPage

To ease plugin installation, pages can be dynamically registered into Volt. This feature is still experimental and may be expanded upon in a future release.

$page = new \volt\api\DynamicPage("/hello", $this); // For second param see identified. $page("This is the content"); //Page is now available at /hello and will display "This is the content"

Handlebars Helpers with HandlebarsHelper

Helpers allow custom features to be added to the handlebars language. Helpers are callable and should be anonymous functions. Due to the threaded nature of Volt, helpers are unstable and can easily cause issues. In order to use helpers, you will need to set your @volt-api to kilo or higher.

Direct thread access with ServerThread

Sometimes the API doesn't cut it and you might need direct access the the server thread. You can do this using a ServerThread object. These objects will forward all function calls to the volt server. To use ServerThread, you will need to set your @volt-apito mega or higher.

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Volt IconVolt

Formerly HTTPServer

Volt is an hyper-powerful integrated website solution for PocketMine. Driven by Handlebars and pthreads, volt is an extensive webserver. Volt's dependencies are managed using Miner.

What's changing in v3.0.0?

  • Name. HTTPServer is now volt. Why? I thought carefully about this one and I figured that "HTTPServer" did not represent the project correctly.
  • Threading. Volt is now better at threading. Every request is run by a worker in a pool. This allows multiple requests to be processed in parallel.
  • Templating. Now Volt is driven by Handlebars for high speeds and extreme customization.
  • API. The API has been entirely rewritten to be more fun to use. It is much more logical and powerful.

The /volt command

The /volt command allows interaction with the API and the server itself. It doesn't have many features right now, but I am always open to suggestions for new ones.

  • /volt api list - Will list plugins that are using the API
  • /volt api getsub - Will list what subscription every plugin on the server holds in the Volt API

Volt API

The API is still tentative and might undergo some large structural changes before its release, so don't get too attached to it. The API centralizes on WebsiteData objects which are magical objects that allow interaction with the server. These objects mimic arrays by implementing \ArrayAccess, \Countable, and \IteratorAggregate. The API also exposes DynamicPage for registering pages, ServerThread for direct interaction with the server and HandlebarsHelper for injecting code into handlebars.

API Security

API subscription levels

Volt's API will offer features which can cause harm to the PocketMine instance. For example, using a HandlebarsHelper can easily cause a segfault or a memory leak if not used correctly. In order to combat this, Volt provides an API subscription system. There are five subscription levels.

  • micro (Default) - DynamicPage and WebsiteData
  • deci- Not currently used
  • kilo - HandlebarsHelper
  • mega - ServerThread
  • peta - Not currently used

You can specify an API level to consume in the base class of your plugin using a doc comment on the class. You will have access to all lower levels as well. The following comment is used on the Volt main class

/** * Class Volt * @package volt * @volt-api peta */class Volt extends PluginBase{

Note If you want to save space you can remove the first two lines of the comment.

Internal method protection

Some methods are protected by Volt for API security. If you attempt to access one of these you will get thrown an InternalMethodException.

API Identification

In an optimal setting you should identify yourself to Volt. This will allow Volt to create logs of your API usage. Identification is recommended for all interactions and is required for all interactions except WebsiteData. There are three options for identification

  • PluginBase (Recommended)
  • Plugin name
  • Auto-detect (Not recommended)
MonitoredWebsiteData
/* Option #1 (Recommended) */$data = new \volt\api\MonitoredWebsiteData($this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\MonitoredWebsiteData("PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\MonitoredWebsiteData(); //Called from within a PluginBase, and requires class name to equal plugin name
DynamicPage
/* Option #1 (Recommended) */$data = new \volt\api\DynamicPage("/page", $this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\DynamicPage("/page", "PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\DynamicPage("/page"); //Called from within a PluginBase, and requires class name to equal plugin name

If an identification request fails a volt\exception\PluginIdentificationException will be thrown.

Setting and getting values with WebsiteData or MonitoredWebsiteData

Once you have a WebsiteData object, you get a link to the global scope of handlebars variables. It is highly recommended to put all your variables in a namespace for your plugin, this helps avoid collisions.

$data = new \volt\WebsiteData(); //We are using anon$data["foo"] = ["1", "2", "3"]; // not loggedvar_dump($data["foo"]); // not logged$data = new \volt\MonitoredWebsiteData($this); // We are using identified, $this is a \pocketmine\plugin\Plugin$data["bar"] = ["1", "2", "3"]; // loggedvar_dump($data["bar"]); // logged

Dynamic Page Registration with DynamicPage

To ease plugin installation, pages can be dynamically registered into Volt. This feature is still experimental and may be expanded upon in a future release.

$page = new \volt\api\DynamicPage("/hello", $this); // For second param see identified. $page("This is the content"); //Page is now available at /hello and will display "This is the content"

Handlebars Helpers with HandlebarsHelper

Helpers allow custom features to be added to the handlebars language. Helpers are callable and should be anonymous functions. Due to the threaded nature of Volt, helpers are unstable and can easily cause issues. In order to use helpers, you will need to set your @volt-api to kilo or higher.

Direct thread access with ServerThread

Sometimes the API doesn't cut it and you might need direct access the the server thread. You can do this using a ServerThread object. These objects will forward all function calls to the volt server. To use ServerThread, you will need to set your @volt-apito mega or higher.

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Volt IconVolt

Formerly HTTPServer

Volt is an hyper-powerful integrated website solution for PocketMine. Driven by Handlebars and pthreads, volt is an extensive webserver. Volt's dependencies are managed using Miner.

What's changing in v3.0.0?

  • Name. HTTPServer is now volt. Why? I thought carefully about this one and I figured that "HTTPServer" did not represent the project correctly.
  • Threading. Volt is now better at threading. Every request is run by a worker in a pool. This allows multiple requests to be processed in parallel.
  • Templating. Now Volt is driven by Handlebars for high speeds and extreme customization.
  • API. The API has been entirely rewritten to be more fun to use. It is much more logical and powerful.

The /volt command

The /volt command allows interaction with the API and the server itself. It doesn't have many features right now, but I am always open to suggestions for new ones.

  • /volt api list - Will list plugins that are using the API
  • /volt api getsub - Will list what subscription every plugin on the server holds in the Volt API

Volt API

The API is still tentative and might undergo some large structural changes before its release, so don't get too attached to it. The API centralizes on WebsiteData objects which are magical objects that allow interaction with the server. These objects mimic arrays by implementing \ArrayAccess, \Countable, and \IteratorAggregate. The API also exposes DynamicPage for registering pages, ServerThread for direct interaction with the server and HandlebarsHelper for injecting code into handlebars.

API Security

API subscription levels

Volt's API will offer features which can cause harm to the PocketMine instance. For example, using a HandlebarsHelper can easily cause a segfault or a memory leak if not used correctly. In order to combat this, Volt provides an API subscription system. There are five subscription levels.

  • micro (Default) - DynamicPage and WebsiteData
  • deci- Not currently used
  • kilo - HandlebarsHelper
  • mega - ServerThread
  • peta - Not currently used

You can specify an API level to consume in the base class of your plugin using a doc comment on the class. You will have access to all lower levels as well. The following comment is used on the Volt main class

/** * Class Volt * @package volt * @volt-api peta */class Volt extends PluginBase{

Note If you want to save space you can remove the first two lines of the comment.

Internal method protection

Some methods are protected by Volt for API security. If you attempt to access one of these you will get thrown an InternalMethodException.

API Identification

In an optimal setting you should identify yourself to Volt. This will allow Volt to create logs of your API usage. Identification is recommended for all interactions and is required for all interactions except WebsiteData. There are three options for identification

  • PluginBase (Recommended)
  • Plugin name
  • Auto-detect (Not recommended)
MonitoredWebsiteData
/* Option #1 (Recommended) */$data = new \volt\api\MonitoredWebsiteData($this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\MonitoredWebsiteData("PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\MonitoredWebsiteData(); //Called from within a PluginBase, and requires class name to equal plugin name
DynamicPage
/* Option #1 (Recommended) */$data = new \volt\api\DynamicPage("/page", $this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\DynamicPage("/page", "PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\DynamicPage("/page"); //Called from within a PluginBase, and requires class name to equal plugin name

If an identification request fails a volt\exception\PluginIdentificationException will be thrown.

Setting and getting values with WebsiteData or MonitoredWebsiteData

Once you have a WebsiteData object, you get a link to the global scope of handlebars variables. It is highly recommended to put all your variables in a namespace for your plugin, this helps avoid collisions.

$data = new \volt\WebsiteData(); //We are using anon$data["foo"] = ["1", "2", "3"]; // not loggedvar_dump($data["foo"]); // not logged$data = new \volt\MonitoredWebsiteData($this); // We are using identified, $this is a \pocketmine\plugin\Plugin$data["bar"] = ["1", "2", "3"]; // loggedvar_dump($data["bar"]); // logged

Dynamic Page Registration with DynamicPage

To ease plugin installation, pages can be dynamically registered into Volt. This feature is still experimental and may be expanded upon in a future release.

$page = new \volt\api\DynamicPage("/hello", $this); // For second param see identified. $page("This is the content"); //Page is now available at /hello and will display "This is the content"

Handlebars Helpers with HandlebarsHelper

Helpers allow custom features to be added to the handlebars language. Helpers are callable and should be anonymous functions. Due to the threaded nature of Volt, helpers are unstable and can easily cause issues. In order to use helpers, you will need to set your @volt-api to kilo or higher.

Direct thread access with ServerThread

Sometimes the API doesn't cut it and you might need direct access the the server thread. You can do this using a ServerThread object. These objects will forward all function calls to the volt server. To use ServerThread, you will need to set your @volt-apito mega or higher.

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Volt IconVolt

Formerly HTTPServer

Volt is an hyper-powerful integrated website solution for PocketMine. Driven by Handlebars and pthreads, volt is an extensive webserver. Volt's dependencies are managed using Miner.

What's changing in v3.0.0?

  • Name. HTTPServer is now volt. Why? I thought carefully about this one and I figured that "HTTPServer" did not represent the project correctly.
  • Threading. Volt is now better at threading. Every request is run by a worker in a pool. This allows multiple requests to be processed in parallel.
  • Templating. Now Volt is driven by Handlebars for high speeds and extreme customization.
  • API. The API has been entirely rewritten to be more fun to use. It is much more logical and powerful.

The /volt command

The /volt command allows interaction with the API and the server itself. It doesn't have many features right now, but I am always open to suggestions for new ones.

  • /volt api list - Will list plugins that are using the API
  • /volt api getsub - Will list what subscription every plugin on the server holds in the Volt API

Volt API

The API is still tentative and might undergo some large structural changes before its release, so don't get too attached to it. The API centralizes on WebsiteData objects which are magical objects that allow interaction with the server. These objects mimic arrays by implementing \ArrayAccess, \Countable, and \IteratorAggregate. The API also exposes DynamicPage for registering pages, ServerThread for direct interaction with the server and HandlebarsHelper for injecting code into handlebars.

API Security

API subscription levels

Volt's API will offer features which can cause harm to the PocketMine instance. For example, using a HandlebarsHelper can easily cause a segfault or a memory leak if not used correctly. In order to combat this, Volt provides an API subscription system. There are five subscription levels.

  • micro (Default) - DynamicPage and WebsiteData
  • deci- Not currently used
  • kilo - HandlebarsHelper
  • mega - ServerThread
  • peta - Not currently used

You can specify an API level to consume in the base class of your plugin using a doc comment on the class. You will have access to all lower levels as well. The following comment is used on the Volt main class

/** * Class Volt * @package volt * @volt-api peta */class Volt extends PluginBase{

Note If you want to save space you can remove the first two lines of the comment.

Internal method protection

Some methods are protected by Volt for API security. If you attempt to access one of these you will get thrown an InternalMethodException.

API Identification

In an optimal setting you should identify yourself to Volt. This will allow Volt to create logs of your API usage. Identification is recommended for all interactions and is required for all interactions except WebsiteData. There are three options for identification

  • PluginBase (Recommended)
  • Plugin name
  • Auto-detect (Not recommended)
MonitoredWebsiteData
/* Option #1 (Recommended) */$data = new \volt\api\MonitoredWebsiteData($this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\MonitoredWebsiteData("PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\MonitoredWebsiteData(); //Called from within a PluginBase, and requires class name to equal plugin name
DynamicPage
/* Option #1 (Recommended) */$data = new \volt\api\DynamicPage("/page", $this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\DynamicPage("/page", "PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\DynamicPage("/page"); //Called from within a PluginBase, and requires class name to equal plugin name

If an identification request fails a volt\exception\PluginIdentificationException will be thrown.

Setting and getting values with WebsiteData or MonitoredWebsiteData

Once you have a WebsiteData object, you get a link to the global scope of handlebars variables. It is highly recommended to put all your variables in a namespace for your plugin, this helps avoid collisions.

$data = new \volt\WebsiteData(); //We are using anon$data["foo"] = ["1", "2", "3"]; // not loggedvar_dump($data["foo"]); // not logged$data = new \volt\MonitoredWebsiteData($this); // We are using identified, $this is a \pocketmine\plugin\Plugin$data["bar"] = ["1", "2", "3"]; // loggedvar_dump($data["bar"]); // logged

Dynamic Page Registration with DynamicPage

To ease plugin installation, pages can be dynamically registered into Volt. This feature is still experimental and may be expanded upon in a future release.

$page = new \volt\api\DynamicPage("/hello", $this); // For second param see identified. $page("This is the content"); //Page is now available at /hello and will display "This is the content"

Handlebars Helpers with HandlebarsHelper

Helpers allow custom features to be added to the handlebars language. Helpers are callable and should be anonymous functions. Due to the threaded nature of Volt, helpers are unstable and can easily cause issues. In order to use helpers, you will need to set your @volt-api to kilo or higher.

Direct thread access with ServerThread

Sometimes the API doesn't cut it and you might need direct access the the server thread. You can do this using a ServerThread object. These objects will forward all function calls to the volt server. To use ServerThread, you will need to set your @volt-apito mega or higher.

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Volt IconVolt

Formerly HTTPServer

Volt is an hyper-powerful integrated website solution for PocketMine. Driven by Handlebars and pthreads, volt is an extensive webserver. Volt's dependencies are managed using Miner.

What's changing in v3.0.0?

  • Name. HTTPServer is now volt. Why? I thought carefully about this one and I figured that "HTTPServer" did not represent the project correctly.
  • Threading. Volt is now better at threading. Every request is run by a worker in a pool. This allows multiple requests to be processed in parallel.
  • Templating. Now Volt is driven by Handlebars for high speeds and extreme customization.
  • API. The API has been entirely rewritten to be more fun to use. It is much more logical and powerful.

The /volt command

The /volt command allows interaction with the API and the server itself. It doesn't have many features right now, but I am always open to suggestions for new ones.

  • /volt api list - Will list plugins that are using the API
  • /volt api getsub - Will list what subscription every plugin on the server holds in the Volt API

Volt API

The API is still tentative and might undergo some large structural changes before its release, so don't get too attached to it. The API centralizes on WebsiteData objects which are magical objects that allow interaction with the server. These objects mimic arrays by implementing \ArrayAccess, \Countable, and \IteratorAggregate. The API also exposes DynamicPage for registering pages, ServerThread for direct interaction with the server and HandlebarsHelper for injecting code into handlebars.

API Security

API subscription levels

Volt's API will offer features which can cause harm to the PocketMine instance. For example, using a HandlebarsHelper can easily cause a segfault or a memory leak if not used correctly. In order to combat this, Volt provides an API subscription system. There are five subscription levels.

  • micro (Default) - DynamicPage and WebsiteData
  • deci- Not currently used
  • kilo - HandlebarsHelper
  • mega - ServerThread
  • peta - Not currently used

You can specify an API level to consume in the base class of your plugin using a doc comment on the class. You will have access to all lower levels as well. The following comment is used on the Volt main class

/** * Class Volt * @package volt * @volt-api peta */class Volt extends PluginBase{

Note If you want to save space you can remove the first two lines of the comment.

Internal method protection

Some methods are protected by Volt for API security. If you attempt to access one of these you will get thrown an InternalMethodException.

API Identification

In an optimal setting you should identify yourself to Volt. This will allow Volt to create logs of your API usage. Identification is recommended for all interactions and is required for all interactions except WebsiteData. There are three options for identification

  • PluginBase (Recommended)
  • Plugin name
  • Auto-detect (Not recommended)
MonitoredWebsiteData
/* Option #1 (Recommended) */$data = new \volt\api\MonitoredWebsiteData($this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\MonitoredWebsiteData("PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\MonitoredWebsiteData(); //Called from within a PluginBase, and requires class name to equal plugin name
DynamicPage
/* Option #1 (Recommended) */$data = new \volt\api\DynamicPage("/page", $this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\DynamicPage("/page", "PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\DynamicPage("/page"); //Called from within a PluginBase, and requires class name to equal plugin name

If an identification request fails a volt\exception\PluginIdentificationException will be thrown.

Setting and getting values with WebsiteData or MonitoredWebsiteData

Once you have a WebsiteData object, you get a link to the global scope of handlebars variables. It is highly recommended to put all your variables in a namespace for your plugin, this helps avoid collisions.

$data = new \volt\WebsiteData(); //We are using anon$data["foo"] = ["1", "2", "3"]; // not loggedvar_dump($data["foo"]); // not logged$data = new \volt\MonitoredWebsiteData($this); // We are using identified, $this is a \pocketmine\plugin\Plugin$data["bar"] = ["1", "2", "3"]; // loggedvar_dump($data["bar"]); // logged

Dynamic Page Registration with DynamicPage

To ease plugin installation, pages can be dynamically registered into Volt. This feature is still experimental and may be expanded upon in a future release.

$page = new \volt\api\DynamicPage("/hello", $this); // For second param see identified. $page("This is the content"); //Page is now available at /hello and will display "This is the content"

Handlebars Helpers with HandlebarsHelper

Helpers allow custom features to be added to the handlebars language. Helpers are callable and should be anonymous functions. Due to the threaded nature of Volt, helpers are unstable and can easily cause issues. In order to use helpers, you will need to set your @volt-api to kilo or higher.

Direct thread access with ServerThread

Sometimes the API doesn't cut it and you might need direct access the the server thread. You can do this using a ServerThread object. These objects will forward all function calls to the volt server. To use ServerThread, you will need to set your @volt-apito mega or higher.

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Volt IconVolt

Formerly HTTPServer

Volt is an hyper-powerful integrated website solution for PocketMine. Driven by Handlebars and pthreads, volt is an extensive webserver. Volt's dependencies are managed using Miner.

What's changing in v3.0.0?

  • Name. HTTPServer is now volt. Why? I thought carefully about this one and I figured that "HTTPServer" did not represent the project correctly.
  • Threading. Volt is now better at threading. Every request is run by a worker in a pool. This allows multiple requests to be processed in parallel.
  • Templating. Now Volt is driven by Handlebars for high speeds and extreme customization.
  • API. The API has been entirely rewritten to be more fun to use. It is much more logical and powerful.

The /volt command

The /volt command allows interaction with the API and the server itself. It doesn't have many features right now, but I am always open to suggestions for new ones.

  • /volt api list - Will list plugins that are using the API
  • /volt api getsub - Will list what subscription every plugin on the server holds in the Volt API

Volt API

The API is still tentative and might undergo some large structural changes before its release, so don't get too attached to it. The API centralizes on WebsiteData objects which are magical objects that allow interaction with the server. These objects mimic arrays by implementing \ArrayAccess, \Countable, and \IteratorAggregate. The API also exposes DynamicPage for registering pages, ServerThread for direct interaction with the server and HandlebarsHelper for injecting code into handlebars.

API Security

API subscription levels

Volt's API will offer features which can cause harm to the PocketMine instance. For example, using a HandlebarsHelper can easily cause a segfault or a memory leak if not used correctly. In order to combat this, Volt provides an API subscription system. There are five subscription levels.

  • micro (Default) - DynamicPage and WebsiteData
  • deci- Not currently used
  • kilo - HandlebarsHelper
  • mega - ServerThread
  • peta - Not currently used

You can specify an API level to consume in the base class of your plugin using a doc comment on the class. You will have access to all lower levels as well. The following comment is used on the Volt main class

/** * Class Volt * @package volt * @volt-api peta */class Volt extends PluginBase{

Note If you want to save space you can remove the first two lines of the comment.

Internal method protection

Some methods are protected by Volt for API security. If you attempt to access one of these you will get thrown an InternalMethodException.

API Identification

In an optimal setting you should identify yourself to Volt. This will allow Volt to create logs of your API usage. Identification is recommended for all interactions and is required for all interactions except WebsiteData. There are three options for identification

  • PluginBase (Recommended)
  • Plugin name
  • Auto-detect (Not recommended)
MonitoredWebsiteData
/* Option #1 (Recommended) */$data = new \volt\api\MonitoredWebsiteData($this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\MonitoredWebsiteData("PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\MonitoredWebsiteData(); //Called from within a PluginBase, and requires class name to equal plugin name
DynamicPage
/* Option #1 (Recommended) */$data = new \volt\api\DynamicPage("/page", $this); //Called from within a PluginBase/* Option #2 */$data = new \volt\api\DynamicPage("/page", "PluginName"); //Called from anywhere/* Option #3 (Not recommended) */$data = new \volt\api\DynamicPage("/page"); //Called from within a PluginBase, and requires class name to equal plugin name

If an identification request fails a volt\exception\PluginIdentificationException will be thrown.

Setting and getting values with WebsiteData or MonitoredWebsiteData

Once you have a WebsiteData object, you get a link to the global scope of handlebars variables. It is highly recommended to put all your variables in a namespace for your plugin, this helps avoid collisions.

$data = new \volt\WebsiteData(); //We are using anon$data["foo"] = ["1", "2", "3"]; // not loggedvar_dump($data["foo"]); // not logged$data = new \volt\MonitoredWebsiteData($this); // We are using identified, $this is a \pocketmine\plugin\Plugin$data["bar"] = ["1", "2", "3"]; // loggedvar_dump($data["bar"]); // logged

Dynamic Page Registration with DynamicPage

To ease plugin installation, pages can be dynamically registered into Volt. This feature is still experimental and may be expanded upon in a future release.

$page = new \volt\api\DynamicPage("/hello", $this); // For second param see identified. $page("This is the content"); //Page is now available at /hello and will display "This is the content"

Handlebars Helpers with HandlebarsHelper

Helpers allow custom features to be added to the handlebars language. Helpers are callable and should be anonymous functions. Due to the threaded nature of Volt, helpers are unstable and can easily cause issues. In order to use helpers, you will need to set your @volt-api to kilo or higher.

Direct thread access with ServerThread

Sometimes the API doesn't cut it and you might need direct access the the server thread. You can do this using a ServerThread object. These objects will forward all function calls to the volt server. To use ServerThread, you will need to set your @volt-apito mega or higher.

Releases

Packages

Used by

Contributors

Languages