Skip to content

Latest commit

History

89 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Votifier Redone

This is a simple continuation of a really awesome plugin called votifier. The original version is broken, so I made this to fix those issues.

What it is

Votifier is a Bukkit plugin whose purpose is to be notified (aka votified) when a vote is made on a Minecraft server top list for the server. Votifier creates a lightweight server that waits for connections by Minecraft server lists and uses a simple protocol to get the required information. Votifier is secure, and makes sure that all vote notifications are delivered by authentic top lists.

Configuring Votifier

Votifier configures itself the first time it is run.

If you want to customize Votifier, simply the edit ./plugins/votifier/config.yml file.

Writing Vote Listeners

A vote listener implements the VoteListener interface which contains an implementation of the voteMade method.

A basic vote listener looks something like this:

import com.vexsoftware.votifier.model.Vote;
import com.vexsoftware.votifier.model.VoteListener;
public class BasicVoteListener implements VoteListener {
public void voteMade(Vote vote) {
System.out.println("Received: " + vote);
}
}

Compiling Vote Listeners

Vote listeners can be compiled by including Votifier in the class path. For example:

javac -cp Votifier.jar FlatfileVoteListener.java

Encryption

Votifier uses one-way RSA encryption to ensure that only a trusted toplist can tell Votifier when a vote has been made. When it is first run, Votifier will generate a 2048 bit RSA key pair and store the keys in the ./plugins/votifier/rsa directory. When you link Votifier with a toplist, the toplist will ask you for your Votifier public key - this is located at ./plugins/votifier/rsa/public.key and the toplist will use this key to encrypt vote data. It is essential that you do not share these keys with your players, as a smart player can use the key to create a spoof packet and tell Votifier that they voted when they really didn't.

Protocol Documentation

This documentation is for server lists that wish to add Votifier support.

A connection is made to the Votifier server by the server list, and immediately Votifier will send its version in the following packet:

"VOTIFIER <version>"

Votifier then expects a 256 byte RSA encrypted block (the public key should be obtained by the Votifier user), with the following format:

TypeValue
stringVOTE
stringserviceName
stringusername
stringaddress
stringtimeStamp
byte[]empty

The first string of value "VOTE" is an opcode check to ensure that RSA was encoded and decoded properly, if this value is wrong then Votifier assumes that there was a problem with encryption and drops the connection. serviceName is the name of the top list service, username is the username (entered by the voter) of the person who voted, address is the IP address of the voter, and timeStamp is the time stamp of the vote. Each string is delimited by the newline character \n (byte value 10). The space block is the empty space that is left over, the block must be exactly 256 bytes regardless of how much information it holds.

About

Votifier, now for 1.13. Get it now

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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 - tylerhyperHD/votifier: Votifier, now for 1.13. Get it now · GitHub
Skip to content

Latest commit

History

89 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Votifier Redone

This is a simple continuation of a really awesome plugin called votifier. The original version is broken, so I made this to fix those issues.

What it is

Votifier is a Bukkit plugin whose purpose is to be notified (aka votified) when a vote is made on a Minecraft server top list for the server. Votifier creates a lightweight server that waits for connections by Minecraft server lists and uses a simple protocol to get the required information. Votifier is secure, and makes sure that all vote notifications are delivered by authentic top lists.

Configuring Votifier

Votifier configures itself the first time it is run.

If you want to customize Votifier, simply the edit ./plugins/votifier/config.yml file.

Writing Vote Listeners

A vote listener implements the VoteListener interface which contains an implementation of the voteMade method.

A basic vote listener looks something like this:

import com.vexsoftware.votifier.model.Vote;
import com.vexsoftware.votifier.model.VoteListener;
public class BasicVoteListener implements VoteListener {
public void voteMade(Vote vote) {
System.out.println("Received: " + vote);
}
}

Compiling Vote Listeners

Vote listeners can be compiled by including Votifier in the class path. For example:

javac -cp Votifier.jar FlatfileVoteListener.java

Encryption

Votifier uses one-way RSA encryption to ensure that only a trusted toplist can tell Votifier when a vote has been made. When it is first run, Votifier will generate a 2048 bit RSA key pair and store the keys in the ./plugins/votifier/rsa directory. When you link Votifier with a toplist, the toplist will ask you for your Votifier public key - this is located at ./plugins/votifier/rsa/public.key and the toplist will use this key to encrypt vote data. It is essential that you do not share these keys with your players, as a smart player can use the key to create a spoof packet and tell Votifier that they voted when they really didn't.

Protocol Documentation

This documentation is for server lists that wish to add Votifier support.

A connection is made to the Votifier server by the server list, and immediately Votifier will send its version in the following packet:

"VOTIFIER <version>"

Votifier then expects a 256 byte RSA encrypted block (the public key should be obtained by the Votifier user), with the following format:

TypeValue
stringVOTE
stringserviceName
stringusername
stringaddress
stringtimeStamp
byte[]empty

The first string of value "VOTE" is an opcode check to ensure that RSA was encoded and decoded properly, if this value is wrong then Votifier assumes that there was a problem with encryption and drops the connection. serviceName is the name of the top list service, username is the username (entered by the voter) of the person who voted, address is the IP address of the voter, and timeStamp is the time stamp of the vote. Each string is delimited by the newline character \n (byte value 10). The space block is the empty space that is left over, the block must be exactly 256 bytes regardless of how much information it holds.

About

Votifier, now for 1.13. Get it now

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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 - tylerhyperHD/votifier: Votifier, now for 1.13. Get it now · GitHub
Skip to content

Latest commit

History

89 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Votifier Redone

This is a simple continuation of a really awesome plugin called votifier. The original version is broken, so I made this to fix those issues.

What it is

Votifier is a Bukkit plugin whose purpose is to be notified (aka votified) when a vote is made on a Minecraft server top list for the server. Votifier creates a lightweight server that waits for connections by Minecraft server lists and uses a simple protocol to get the required information. Votifier is secure, and makes sure that all vote notifications are delivered by authentic top lists.

Configuring Votifier

Votifier configures itself the first time it is run.

If you want to customize Votifier, simply the edit ./plugins/votifier/config.yml file.

Writing Vote Listeners

A vote listener implements the VoteListener interface which contains an implementation of the voteMade method.

A basic vote listener looks something like this:

import com.vexsoftware.votifier.model.Vote;
import com.vexsoftware.votifier.model.VoteListener;
public class BasicVoteListener implements VoteListener {
public void voteMade(Vote vote) {
System.out.println("Received: " + vote);
}
}

Compiling Vote Listeners

Vote listeners can be compiled by including Votifier in the class path. For example:

javac -cp Votifier.jar FlatfileVoteListener.java

Encryption

Votifier uses one-way RSA encryption to ensure that only a trusted toplist can tell Votifier when a vote has been made. When it is first run, Votifier will generate a 2048 bit RSA key pair and store the keys in the ./plugins/votifier/rsa directory. When you link Votifier with a toplist, the toplist will ask you for your Votifier public key - this is located at ./plugins/votifier/rsa/public.key and the toplist will use this key to encrypt vote data. It is essential that you do not share these keys with your players, as a smart player can use the key to create a spoof packet and tell Votifier that they voted when they really didn't.

Protocol Documentation

This documentation is for server lists that wish to add Votifier support.

A connection is made to the Votifier server by the server list, and immediately Votifier will send its version in the following packet:

"VOTIFIER <version>"

Votifier then expects a 256 byte RSA encrypted block (the public key should be obtained by the Votifier user), with the following format:

TypeValue
stringVOTE
stringserviceName
stringusername
stringaddress
stringtimeStamp
byte[]empty

The first string of value "VOTE" is an opcode check to ensure that RSA was encoded and decoded properly, if this value is wrong then Votifier assumes that there was a problem with encryption and drops the connection. serviceName is the name of the top list service, username is the username (entered by the voter) of the person who voted, address is the IP address of the voter, and timeStamp is the time stamp of the vote. Each string is delimited by the newline character \n (byte value 10). The space block is the empty space that is left over, the block must be exactly 256 bytes regardless of how much information it holds.

About

Votifier, now for 1.13. Get it now

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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 - tylerhyperHD/votifier: Votifier, now for 1.13. Get it now · GitHub
Skip to content

Latest commit

History

89 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Votifier Redone

This is a simple continuation of a really awesome plugin called votifier. The original version is broken, so I made this to fix those issues.

What it is

Votifier is a Bukkit plugin whose purpose is to be notified (aka votified) when a vote is made on a Minecraft server top list for the server. Votifier creates a lightweight server that waits for connections by Minecraft server lists and uses a simple protocol to get the required information. Votifier is secure, and makes sure that all vote notifications are delivered by authentic top lists.

Configuring Votifier

Votifier configures itself the first time it is run.

If you want to customize Votifier, simply the edit ./plugins/votifier/config.yml file.

Writing Vote Listeners

A vote listener implements the VoteListener interface which contains an implementation of the voteMade method.

A basic vote listener looks something like this:

import com.vexsoftware.votifier.model.Vote;
import com.vexsoftware.votifier.model.VoteListener;
public class BasicVoteListener implements VoteListener {
public void voteMade(Vote vote) {
System.out.println("Received: " + vote);
}
}

Compiling Vote Listeners

Vote listeners can be compiled by including Votifier in the class path. For example:

javac -cp Votifier.jar FlatfileVoteListener.java

Encryption

Votifier uses one-way RSA encryption to ensure that only a trusted toplist can tell Votifier when a vote has been made. When it is first run, Votifier will generate a 2048 bit RSA key pair and store the keys in the ./plugins/votifier/rsa directory. When you link Votifier with a toplist, the toplist will ask you for your Votifier public key - this is located at ./plugins/votifier/rsa/public.key and the toplist will use this key to encrypt vote data. It is essential that you do not share these keys with your players, as a smart player can use the key to create a spoof packet and tell Votifier that they voted when they really didn't.

Protocol Documentation

This documentation is for server lists that wish to add Votifier support.

A connection is made to the Votifier server by the server list, and immediately Votifier will send its version in the following packet:

"VOTIFIER <version>"

Votifier then expects a 256 byte RSA encrypted block (the public key should be obtained by the Votifier user), with the following format:

TypeValue
stringVOTE
stringserviceName
stringusername
stringaddress
stringtimeStamp
byte[]empty

The first string of value "VOTE" is an opcode check to ensure that RSA was encoded and decoded properly, if this value is wrong then Votifier assumes that there was a problem with encryption and drops the connection. serviceName is the name of the top list service, username is the username (entered by the voter) of the person who voted, address is the IP address of the voter, and timeStamp is the time stamp of the vote. Each string is delimited by the newline character \n (byte value 10). The space block is the empty space that is left over, the block must be exactly 256 bytes regardless of how much information it holds.

About

Votifier, now for 1.13. Get it now

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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 - tylerhyperHD/votifier: Votifier, now for 1.13. Get it now · GitHub
Skip to content

Latest commit

History

89 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Votifier Redone

This is a simple continuation of a really awesome plugin called votifier. The original version is broken, so I made this to fix those issues.

What it is

Votifier is a Bukkit plugin whose purpose is to be notified (aka votified) when a vote is made on a Minecraft server top list for the server. Votifier creates a lightweight server that waits for connections by Minecraft server lists and uses a simple protocol to get the required information. Votifier is secure, and makes sure that all vote notifications are delivered by authentic top lists.

Configuring Votifier

Votifier configures itself the first time it is run.

If you want to customize Votifier, simply the edit ./plugins/votifier/config.yml file.

Writing Vote Listeners

A vote listener implements the VoteListener interface which contains an implementation of the voteMade method.

A basic vote listener looks something like this:

import com.vexsoftware.votifier.model.Vote;
import com.vexsoftware.votifier.model.VoteListener;
public class BasicVoteListener implements VoteListener {
public void voteMade(Vote vote) {
System.out.println("Received: " + vote);
}
}

Compiling Vote Listeners

Vote listeners can be compiled by including Votifier in the class path. For example:

javac -cp Votifier.jar FlatfileVoteListener.java

Encryption

Votifier uses one-way RSA encryption to ensure that only a trusted toplist can tell Votifier when a vote has been made. When it is first run, Votifier will generate a 2048 bit RSA key pair and store the keys in the ./plugins/votifier/rsa directory. When you link Votifier with a toplist, the toplist will ask you for your Votifier public key - this is located at ./plugins/votifier/rsa/public.key and the toplist will use this key to encrypt vote data. It is essential that you do not share these keys with your players, as a smart player can use the key to create a spoof packet and tell Votifier that they voted when they really didn't.

Protocol Documentation

This documentation is for server lists that wish to add Votifier support.

A connection is made to the Votifier server by the server list, and immediately Votifier will send its version in the following packet:

"VOTIFIER <version>"

Votifier then expects a 256 byte RSA encrypted block (the public key should be obtained by the Votifier user), with the following format:

TypeValue
stringVOTE
stringserviceName
stringusername
stringaddress
stringtimeStamp
byte[]empty

The first string of value "VOTE" is an opcode check to ensure that RSA was encoded and decoded properly, if this value is wrong then Votifier assumes that there was a problem with encryption and drops the connection. serviceName is the name of the top list service, username is the username (entered by the voter) of the person who voted, address is the IP address of the voter, and timeStamp is the time stamp of the vote. Each string is delimited by the newline character \n (byte value 10). The space block is the empty space that is left over, the block must be exactly 256 bytes regardless of how much information it holds.

About

Votifier, now for 1.13. Get it now

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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 - tylerhyperHD/votifier: Votifier, now for 1.13. Get it now · GitHub
Skip to content

Latest commit

History

89 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Votifier Redone

This is a simple continuation of a really awesome plugin called votifier. The original version is broken, so I made this to fix those issues.

What it is

Votifier is a Bukkit plugin whose purpose is to be notified (aka votified) when a vote is made on a Minecraft server top list for the server. Votifier creates a lightweight server that waits for connections by Minecraft server lists and uses a simple protocol to get the required information. Votifier is secure, and makes sure that all vote notifications are delivered by authentic top lists.

Configuring Votifier

Votifier configures itself the first time it is run.

If you want to customize Votifier, simply the edit ./plugins/votifier/config.yml file.

Writing Vote Listeners

A vote listener implements the VoteListener interface which contains an implementation of the voteMade method.

A basic vote listener looks something like this:

import com.vexsoftware.votifier.model.Vote;
import com.vexsoftware.votifier.model.VoteListener;
public class BasicVoteListener implements VoteListener {
public void voteMade(Vote vote) {
System.out.println("Received: " + vote);
}
}

Compiling Vote Listeners

Vote listeners can be compiled by including Votifier in the class path. For example:

javac -cp Votifier.jar FlatfileVoteListener.java

Encryption

Votifier uses one-way RSA encryption to ensure that only a trusted toplist can tell Votifier when a vote has been made. When it is first run, Votifier will generate a 2048 bit RSA key pair and store the keys in the ./plugins/votifier/rsa directory. When you link Votifier with a toplist, the toplist will ask you for your Votifier public key - this is located at ./plugins/votifier/rsa/public.key and the toplist will use this key to encrypt vote data. It is essential that you do not share these keys with your players, as a smart player can use the key to create a spoof packet and tell Votifier that they voted when they really didn't.

Protocol Documentation

This documentation is for server lists that wish to add Votifier support.

A connection is made to the Votifier server by the server list, and immediately Votifier will send its version in the following packet:

"VOTIFIER <version>"

Votifier then expects a 256 byte RSA encrypted block (the public key should be obtained by the Votifier user), with the following format:

TypeValue
stringVOTE
stringserviceName
stringusername
stringaddress
stringtimeStamp
byte[]empty

The first string of value "VOTE" is an opcode check to ensure that RSA was encoded and decoded properly, if this value is wrong then Votifier assumes that there was a problem with encryption and drops the connection. serviceName is the name of the top list service, username is the username (entered by the voter) of the person who voted, address is the IP address of the voter, and timeStamp is the time stamp of the vote. Each string is delimited by the newline character \n (byte value 10). The space block is the empty space that is left over, the block must be exactly 256 bytes regardless of how much information it holds.

About

Votifier, now for 1.13. Get it now

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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 - tylerhyperHD/votifier: Votifier, now for 1.13. Get it now · GitHub
Skip to content

Latest commit

History

89 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Votifier Redone

This is a simple continuation of a really awesome plugin called votifier. The original version is broken, so I made this to fix those issues.

What it is

Votifier is a Bukkit plugin whose purpose is to be notified (aka votified) when a vote is made on a Minecraft server top list for the server. Votifier creates a lightweight server that waits for connections by Minecraft server lists and uses a simple protocol to get the required information. Votifier is secure, and makes sure that all vote notifications are delivered by authentic top lists.

Configuring Votifier

Votifier configures itself the first time it is run.

If you want to customize Votifier, simply the edit ./plugins/votifier/config.yml file.

Writing Vote Listeners

A vote listener implements the VoteListener interface which contains an implementation of the voteMade method.

A basic vote listener looks something like this:

import com.vexsoftware.votifier.model.Vote;
import com.vexsoftware.votifier.model.VoteListener;
public class BasicVoteListener implements VoteListener {
public void voteMade(Vote vote) {
System.out.println("Received: " + vote);
}
}

Compiling Vote Listeners

Vote listeners can be compiled by including Votifier in the class path. For example:

javac -cp Votifier.jar FlatfileVoteListener.java

Encryption

Votifier uses one-way RSA encryption to ensure that only a trusted toplist can tell Votifier when a vote has been made. When it is first run, Votifier will generate a 2048 bit RSA key pair and store the keys in the ./plugins/votifier/rsa directory. When you link Votifier with a toplist, the toplist will ask you for your Votifier public key - this is located at ./plugins/votifier/rsa/public.key and the toplist will use this key to encrypt vote data. It is essential that you do not share these keys with your players, as a smart player can use the key to create a spoof packet and tell Votifier that they voted when they really didn't.

Protocol Documentation

This documentation is for server lists that wish to add Votifier support.

A connection is made to the Votifier server by the server list, and immediately Votifier will send its version in the following packet:

"VOTIFIER <version>"

Votifier then expects a 256 byte RSA encrypted block (the public key should be obtained by the Votifier user), with the following format:

TypeValue
stringVOTE
stringserviceName
stringusername
stringaddress
stringtimeStamp
byte[]empty

The first string of value "VOTE" is an opcode check to ensure that RSA was encoded and decoded properly, if this value is wrong then Votifier assumes that there was a problem with encryption and drops the connection. serviceName is the name of the top list service, username is the username (entered by the voter) of the person who voted, address is the IP address of the voter, and timeStamp is the time stamp of the vote. Each string is delimited by the newline character \n (byte value 10). The space block is the empty space that is left over, the block must be exactly 256 bytes regardless of how much information it holds.

About

Votifier, now for 1.13. Get it now

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

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 - tylerhyperHD/votifier: Votifier, now for 1.13. Get it now · GitHub
Skip to content

Latest commit

History

89 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Votifier Redone

This is a simple continuation of a really awesome plugin called votifier. The original version is broken, so I made this to fix those issues.

What it is

Votifier is a Bukkit plugin whose purpose is to be notified (aka votified) when a vote is made on a Minecraft server top list for the server. Votifier creates a lightweight server that waits for connections by Minecraft server lists and uses a simple protocol to get the required information. Votifier is secure, and makes sure that all vote notifications are delivered by authentic top lists.

Configuring Votifier

Votifier configures itself the first time it is run.

If you want to customize Votifier, simply the edit ./plugins/votifier/config.yml file.

Writing Vote Listeners

A vote listener implements the VoteListener interface which contains an implementation of the voteMade method.

A basic vote listener looks something like this:

import com.vexsoftware.votifier.model.Vote;
import com.vexsoftware.votifier.model.VoteListener;
public class BasicVoteListener implements VoteListener {
public void voteMade(Vote vote) {
System.out.println("Received: " + vote);
}
}

Compiling Vote Listeners

Vote listeners can be compiled by including Votifier in the class path. For example:

javac -cp Votifier.jar FlatfileVoteListener.java

Encryption

Votifier uses one-way RSA encryption to ensure that only a trusted toplist can tell Votifier when a vote has been made. When it is first run, Votifier will generate a 2048 bit RSA key pair and store the keys in the ./plugins/votifier/rsa directory. When you link Votifier with a toplist, the toplist will ask you for your Votifier public key - this is located at ./plugins/votifier/rsa/public.key and the toplist will use this key to encrypt vote data. It is essential that you do not share these keys with your players, as a smart player can use the key to create a spoof packet and tell Votifier that they voted when they really didn't.

Protocol Documentation

This documentation is for server lists that wish to add Votifier support.

A connection is made to the Votifier server by the server list, and immediately Votifier will send its version in the following packet:

"VOTIFIER <version>"

Votifier then expects a 256 byte RSA encrypted block (the public key should be obtained by the Votifier user), with the following format:

TypeValue
stringVOTE
stringserviceName
stringusername
stringaddress
stringtimeStamp
byte[]empty

The first string of value "VOTE" is an opcode check to ensure that RSA was encoded and decoded properly, if this value is wrong then Votifier assumes that there was a problem with encryption and drops the connection. serviceName is the name of the top list service, username is the username (entered by the voter) of the person who voted, address is the IP address of the voter, and timeStamp is the time stamp of the vote. Each string is delimited by the newline character \n (byte value 10). The space block is the empty space that is left over, the block must be exactly 256 bytes regardless of how much information it holds.

About

Votifier, now for 1.13. Get it now

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages