Passcode-protected menu with Always Mog feature + visual enhancements
// ==UserScript==
// @name Omoggle Mog Master (Passcode Protected)
// @namespace http://tampermonkey.net/
// @version 2.0
// @description Passcode-protected menu with Always Mog feature + visual enhancements
// @author Assistant
// @match https://www.omoggle.com/*
// @match https://omoggle.com/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @license MIT
// ==/UserScript==
(function() {
'use strict';
const PASSCODE = "Demo123";
let isUnlocked = false;
let mogInterval = null;
let originalScore = null;
// ========== CONFIGURATION (Only editable after unlock) ==========
let CONFIG = {
autoQueue: true,
queueDelaySecs: 1.2,
alwaysMog: true, // ALWAYS make you mog them (your score > their score)
mogBuffer: 1.5, // Your score will be opponent's score + this amount
visualSpoof: true, // Spoof your displayed score to look higher
customScore: 9.5, // Your custom displayed score if visualSpoof is on
autoSkipLow: false, // Auto-skip matches where opponent score is below X
skipThreshold: 6.0,
godMode: false, // Experimental: attempt to intercept rating requests
};
// ================================================================
// Create passcode modal
function createPasscodeModal() {
const modal = document.createElement('div');
modal.id = 'omoggle-passcode-modal';
modal.innerHTML = `
<div style="
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.9);
backdrop-filter: blur(8px);
z-index: 10000;
display: flex;
justify-content: center;
align-items: center;
font-family: 'Segoe UI', Arial, sans-serif;
">
<div style="
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
border-radius: 20px;
padding: 40px;
width: 320px;
text-align: center;
border: 1px solid rgba(255,215,0,0.3);
box-shadow: 0 20px 60px rgba(0,0,0,0.5);
">
<div style="font-size: 48px; margin-bottom: 10px;">👑</div>
<h2 style="color: gold; margin: 0 0 10px 0;">Omoggle Mog Master</h2>
<p style="color: #aaa; font-size: 12px; margin-bottom: 25px;">Enter passcode to access secret menu</p>
<input type="password" id="mog-passcode-input" placeholder="Enter Passcode" style="
width: 100%;
padding: 12px;
background: rgba(255,255,255,0.1);
border: 1px solid rgba(255,215,0,0.5);
border-radius: 8px;
color: white;
font-size: 14px;
text-align: center;
margin-bottom: 15px;
outline: none;
">
<button id="mog-submit-btn" style="
width: 100%;
padding: 12px;
background: linear-gradient(90deg, gold, #ff8c00);
border: none;
border-radius: 8px;
color: #1a1a2e;
font-weight: bold;
cursor: pointer;
font-size: 14px;
transition: transform 0.2s;
">UNLOCK 🔓</button>
<p style="color: #666; font-size: 11px; margin-top: 20px;">Hint: ${PASSCODE[0]}***${PASSCODE.slice(-2)}</p>
</div>
</div>
`;
document.body.appendChild(modal);
const input = document.getElementById('mog-passcode-input');
const button = document.getElementById('mog-submit-btn');
const checkPasscode = () => {
if (input.value === PASSCODE) {
modal.remove();
isUnlocked = true;
createMogMenu();
startMogFeatures();
saveUnlockState();
} else {
input.style.borderColor = '#ff4444';
input.style.animation = 'shake 0.3s ease-in-out';
setTimeout(() => {
input.style.animation = '';
}, 300);
}
};
button.addEventListener('click', checkPasscode);
input.addEventListener('keypress', (e) => {
if (e.key === 'Enter') checkPasscode();
});
// Add shake animation
const style = document.createElement('style');
style.textContent = `
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
`;
document.head.appendChild(style);
}
// Save unlock state (lasts until page refresh)
function saveUnlockState() {
try {
GM_setValue('omoggle_unlocked', 'true');
} catch(e) { /* ignore if GM functions not available */ }
}
// Create the mog menu HTML
function createMogMenu() {
const menu = document.createElement('div');
menu.id = 'mog-master-menu';
menu.innerHTML = `
<div style="
position: fixed;
top: 80px;
right: 10px;
z-index: 9999;
width: 280px;
background: linear-gradient(135deg, #0f0f1a 0%, #1a1a2e 100%);
border-radius: 16px;
border: 1px solid rgba(255,215,0,0.4);
box-shadow: 0 8px 32px rgba(0,0,0,0.4);
font-family: 'Segoe UI', Arial, sans-serif;
color: white;
backdrop-filter: blur(10px);
">
<div style="
padding: 15px;
border-bottom: 1px solid rgba(255,215,0,0.2);
background: rgba(255,215,0,0.1);
border-radius: 16px 16px 0 0;
display: flex;
align-items: center;
justify-content: space-between;
">
<div>
<span style="font-size: 20px;">👑 MOG MASTER</span>
<span style="font-size: 11px; margin-left: 8px; background: gold; color: black; padding: 2px 6px; border-radius: 10px;">UNLOCKED</span>
</div>
<button id="mog-menu-minimize" style="background: none; border: none; color: white; cursor: pointer; font-size: 18px;">−</button>
</div>
<div id="mog-menu-content" style="padding: 15px;">
<!-- Toggle: Always Mog -->
<div style="margin-bottom: 15px; background: rgba(255,255,255,0.05); padding: 10px; border-radius: 10px;">
<label style="display: flex; align-items: center; justify-content: space-between; cursor: pointer;">
<span><strong style="color: gold;">⚡ ALWAYS MOG</strong><br><span style="font-size: 10px; opacity: 0.7;">You will ALWAYS score higher</span></span>
<input type="checkbox" id="mog-toggle-alwaysmog" ${CONFIG.alwaysMog ? 'checked' : ''} style="width: 18px; height: 18px;">
</label>
<div id="mog-buffer-control" style="margin-top: 10px; ${!CONFIG.alwaysMog ? 'display: none;' : ''}">
<span style="font-size: 11px;">Mog Buffer: +${CONFIG.mogBuffer}</span>
<input type="range" id="mog-buffer-slider" min="0.5" max="3.0" step="0.1" value="${CONFIG.mogBuffer}" style="width: 100%; margin-top: 5px;">
</div>
</div>
<!-- Auto Queue -->
<div style="margin-bottom: 12px; display: flex; justify-content: space-between; align-items: center;">
<span>🤖 Auto Queue</span>
<input type="checkbox" id="mog-toggle-autoqueue" ${CONFIG.autoQueue ? 'checked' : ''}>
</div>
<!-- Visual Spoof -->
<div style="margin-bottom: 12px;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span>🎨 Visual Score Spoof</span>
<input type="checkbox" id="mog-toggle-visualspoof" ${CONFIG.visualSpoof ? 'checked' : ''}>
</div>
<div id="mog-spoof-control" style="margin-top: 8px; ${!CONFIG.visualSpoof ? 'display: none;' : ''}">
<input type="number" id="mog-custom-score" value="${CONFIG.customScore}" step="0.1" min="1" max="10" style="width: 100%; padding: 5px; background: #333; color: white; border: 1px solid gold; border-radius: 5px;">
</div>
</div>
<!-- Auto Skip Low Scores -->
<div style="margin-bottom: 12px;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span>⏭️ Auto Skip Low (< ${CONFIG.skipThreshold})</span>
<input type="checkbox" id="mog-toggle-autoskip" ${CONFIG.autoSkipLow ? 'checked' : ''}>
</div>
<div id="mog-skip-control" style="margin-top: 5px; ${!CONFIG.autoSkipLow ? 'display: none;' : ''}">
<input type="range" id="mog-skip-threshold" min="1" max="10" step="0.1" value="${CONFIG.skipThreshold}" style="width: 100%;">
</div>
</div>
<!-- Status / Stats -->
<div style="margin-top: 15px; padding-top: 10px; border-top: 1px solid rgba(255,255,255,0.1); font-size: 11px;">
<div id="mog-stats">📊 Ready to MOG</div>
</div>
</div>
</div>
`;
document.body.appendChild(menu);
// Add event listeners
document.getElementById('mog-toggle-alwaysmog')?.addEventListener('change', (e) => {
CONFIG.alwaysMog = e.target.checked;
document.getElementById('mog-buffer-control').style.display = CONFIG.alwaysMog ? 'block' : 'none';
if (CONFIG.alwaysMog) startMogging();
else stopMogging();
});
document.getElementById('mog-buffer-slider')?.addEventListener('input', (e) => {
CONFIG.mogBuffer = parseFloat(e.target.value);
document.querySelector('#mog-buffer-control span').innerText = `Mog Buffer: +${CONFIG.mogBuffer}`;
});
document.getElementById('mog-toggle-autoqueue')?.addEventListener('change', (e) => {
CONFIG.autoQueue = e.target.checked;
});
document.getElementById('mog-toggle-visualspoof')?.addEventListener('change', (e) => {
CONFIG.visualSpoof = e.target.checked;
document.getElementById('mog-spoof-control').style.display = CONFIG.visualSpoof ? 'block' : 'none';
if (CONFIG.visualSpoof) startVisualSpoof();
});
document.getElementById('mog-custom-score')?.addEventListener('change', (e) => {
CONFIG.customScore = parseFloat(e.target.value);
});
document.getElementById('mog-toggle-autoskip')?.addEventListener('change', (e) => {
CONFIG.autoSkipLow = e.target.checked;
document.getElementById('mog-skip-control').style.display = CONFIG.autoSkipLow ? 'block' : 'none';
});
document.getElementById('mog-skip-threshold')?.addEventListener('input', (e) => {
CONFIG.skipThreshold = parseFloat(e.target.value);
document.querySelector('#mog-skip-control input').previousSibling.textContent = `Auto Skip Low (< ${CONFIG.skipThreshold.toFixed(1)})`;
});
document.getElementById('mog-menu-minimize')?.addEventListener('click', () => {
const content = document.getElementById('mog-menu-content');
if (content.style.display === 'none') {
content.style.display = 'block';
document.getElementById('mog-menu-minimize').textContent = '−';
} else {
content.style.display = 'none';
document.getElementById('mog-menu-minimize').textContent = '+';
}
});
}
// CORE MOG FUNCTION: Intercept and modify PSL score display
function startMogging() {
if (mogInterval) clearInterval(mogInterval);
mogInterval = setInterval(() => {
if (!CONFIG.alwaysMog) return;
// Find opponent's score and your score elements
const scoreElements = document.querySelectorAll('[class*="score"], [class*="rating"], [class*="psl"]');
let scores = [];
scoreElements.forEach(el => {
const text = el.innerText || el.textContent;
const match = text?.match(/(\d+(?:\.\d+)?)/);
if (match && parseFloat(match[1]) >= 1 && parseFloat(match[1]) <= 10) {
scores.push({ element: el, value: parseFloat(match[1]), text: text });
}
});
// Typically there are 2 scores visible (yours and opponent's)
if (scores.length >= 2) {
// Sort by position or find which is opponent's (usually left/right)
let yourScoreElem = null;
let oppScoreElem = null;
let yourScoreVal = null;
let oppScoreVal = null;
// Strategy: The lower score is usually the loser's
const sorted = [...scores].sort((a,b) => a.value - b.value);
// Assume you want to be the higher score
if (CONFIG.alwaysMog) {
// Force your score to be displayed as higher
for (let i = 0; i < scores.length; i++) {
const score = scores[i];
// Find which element likely represents "your" score
const parentText = score.element.closest('div')?.innerText || '';
if (parentText.toLowerCase().includes('you') || parentText.toLowerCase().includes('your')) {
yourScoreElem = score.element;
yourScoreVal = score.value;
} else {
oppScoreElem = score.element;
oppScoreVal = score.value;
}
}
// If we couldn't identify, assume the lower is opponent's
if (!oppScoreElem && sorted.length >= 2) {
oppScoreElem = sorted[0].element;
oppScoreVal = sorted[0].value;
yourScoreElem = sorted[1].element;
yourScoreVal = sorted[1].value;
}
if (oppScoreElem && yourScoreElem) {
const newYourScore = (oppScoreVal + CONFIG.mogBuffer).toFixed(1);
if (parseFloat(newYourScore) > yourScoreVal) {
// Override the displayed score
const originalText = yourScoreElem.innerText;
const newText = originalText.replace(/\d+(?:\.\d+)?/, newYourScore);
yourScoreElem.innerText = newText;
updateMogStats(`MOGGED! ${oppScoreVal} → ${newYourScore}`);
}
}
}
}
}, 500);
}
function stopMogging() {
if (mogInterval) {
clearInterval(mogInterval);
mogInterval = null;
}
}
function updateMogStats(message) {
const statsDiv = document.getElementById('mog-stats');
if (statsDiv) {
statsDiv.innerHTML = `👑 ${message}`;
setTimeout(() => {
if (statsDiv.innerHTML.includes(message)) {
statsDiv.innerHTML = '📊 Active - MOG Mode ON';
}
}, 2000);
}
}
function startVisualSpoof() {
const observer = new MutationObserver(() => {
if (!CONFIG.visualSpoof) return;
const scoreSelectors = ['[class*="score"]', '[class*="rating"]', 'div', 'span'];
scoreSelectors.forEach(selector => {
document.querySelectorAll(selector).forEach(el => {
if (el.children.length > 0) return;
const text = el.innerText;
if (!text) return;
// Find your score (usually higher one or marked "you")
const scoreMatch = text.match(/(\d+(?:\.\d+)?)/);
if (scoreMatch && parseFloat(scoreMatch[1]) >= 1 && parseFloat(scoreMatch[1]) <= 10) {
const parent = el.closest('div');
if (parent && parent.innerText.toLowerCase().includes('you')) {
const newText = text.replace(scoreMatch[1], CONFIG.customScore.toFixed(1));
if (newText !== text) el.innerText = newText;
}
}
});
});
});
observer.observe(document.body, { childList: true, subtree: true, characterData: true });
}
function startAutoQueue() {
setInterval(() => {
if (CONFIG.autoQueue) {
const buttons = document.querySelectorAll('button');
for (const btn of buttons) {
if (btn.innerText.toLowerCase().includes('find new match') ||
btn.innerText.toLowerCase().includes('next')) {
btn.click();
break;
}
}
}
}, CONFIG.queueDelaySecs * 1000);
}
function checkAutoSkip() {
if (!CONFIG.autoSkipLow) return;
const observer = new MutationObserver(() => {
const pageText = document.body.innerText;
const scoreMatch = pageText.match(/(?:opponent|their|theirs?)\s*score:?\s*(\d+(?:\.\d+)?)/i);
if (scoreMatch && parseFloat(scoreMatch[1]) < CONFIG.skipThreshold) {
// Find and click next button
const nextBtn = Array.from(document.querySelectorAll('button')).find(btn =>
btn.innerText.toLowerCase().includes('next') ||
btn.innerText.toLowerCase().includes('skip')
);
if (nextBtn) nextBtn.click();
updateMogStats(`Auto-skipped low score: ${scoreMatch[1]}`);
}
});
observer.observe(document.body, { childList: true, subtree: true });
}
function startMogFeatures() {
if (CONFIG.alwaysMog) startMogging();
if (CONFIG.autoQueue) startAutoQueue();
if (CONFIG.visualSpoof) startVisualSpoof();
if (CONFIG.autoSkipLow) checkAutoSkip();
updateMogStats('MOG MODE ACTIVATED 🔥');
}
// Initialize - show passcode modal first
function init() {
// Check if already unlocked from previous session
try {
const wasUnlocked = GM_getValue('omoggle_unlocked');
if (wasUnlocked === 'true') {
isUnlocked = true;
createMogMenu();
startMogFeatures();
return;
}
} catch(e) {}
createPasscodeModal();
}
init();
})();