Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (function() {
- //---------------- VARIABLES ----------------
- let a = []
- let b = 0
- let c = ""
- let d = 0
- let h = 0
- let num = 0
- let t = new Date()
- let time = t.getTime()
- let save = 0
- let u = 0
- let ud = 0
- let step = 1
- let paused = false
- let direction = 1
- let lastX = null
- let lastY = null
- let lastLen = 0
- let showMillis = true
- let showCanvas = false
- let tickerEnabled = true
- let countMode = "time"
- //---------------- CANVAS ----------------
- let canvas = document.createElement("canvas")
- let ctx = canvas.getContext("2d")
- canvas.style.position = "fixed"
- canvas.style.left = "0"
- canvas.style.top = "0"
- canvas.style.pointerEvents = "none"
- canvas.style.zIndex = "9998"
- document.body.appendChild(canvas)
- function resizeCanvas() {
- canvas.width = window.innerWidth
- canvas.height = window.innerHeight
- }
- window.addEventListener("resize", resizeCanvas)
- resizeCanvas()
- //---------------- HUD ----------------
- let hud = document.createElement("div")
- hud.style.position = "fixed"
- hud.style.top = "20px"
- hud.style.left = "20px"
- hud.style.background = "rgba(0,0,0,0.8)"
- hud.style.color = "#0f0"
- hud.style.fontFamily = "monospace"
- hud.style.zIndex = "9999"
- hud.style.border = "1px solid #0f0"
- hud.style.minWidth = "200px"
- // TITLE BAR
- let titleBar = document.createElement("div")
- titleBar.textContent = "Ticker HUD"
- titleBar.style.background = "#111"
- titleBar.style.padding = "4px"
- titleBar.style.cursor = "move"
- titleBar.style.borderBottom = "1px solid #0f0"
- titleBar.style.fontWeight = "bold"
- // HUD CONTENT
- let hudContent = document.createElement("div")
- hudContent.style.padding = "6px"
- let hudText = document.createElement("div")
- hudText.textContent = "Ticker Ready"
- // ON/OFF BUTTON
- let toggleRunBtn = document.createElement("button")
- toggleRunBtn.textContent = "Turn OFF"
- toggleRunBtn.onclick = () => {
- tickerEnabled = !tickerEnabled
- toggleRunBtn.textContent = tickerEnabled ? "Turn OFF" : "Turn ON"
- }
- // CANVAS BUTTON
- let toggleCanvasBtn = document.createElement("button")
- toggleCanvasBtn.textContent = "Toggle Canvas"
- toggleCanvasBtn.onclick = () => showCanvas = !showCanvas
- // MILLIS BUTTON
- let toggleMillisBtn = document.createElement("button")
- toggleMillisBtn.textContent = "Toggle ms"
- toggleMillisBtn.onclick = () => showMillis = !showMillis
- // COUNT MODE DROPDOWN
- let modeSelect = document.createElement("select")
- let modes = [
- ["time", "Time"],
- ["integer", "Seconds"],
- ["alpha", "Alphabet"],
- ["omega", "Omega"],
- ["hex", "Hexadecimal"],
- ["binary", "Binary"],
- ["roman", "Roman Numerals"],
- ["romanAlpha", "Roman+Alpha"],
- ["lettersNum", "Letters+Number"],
- ["base36", "Base36"],
- ["countup", "Count Up"],
- ["countdown", "Count Down"],
- ["octal", "Octal"],
- ["base7", "Base7"],
- ["base5", "Base5"],
- ["romanLower", "Roman Lower"],
- ["romanExtended", "Roman Extended"],
- ["fibonacci", "Fibonacci"],
- ["prime", "Prime"],
- ["square", "Square"],
- ["cube", "Cube"],
- ["factorial", "Factorial"],
- ["scientific", "Scientific"],
- ["emoji", "Emoji"],
- ["morse", "Morse"]
- ]
- modes.forEach(m => {
- let o = document.createElement("option")
- o.value = m[0]
- o.textContent = m[1]
- modeSelect.appendChild(o)
- })
- modeSelect.onchange = () => {
- countMode = modeSelect.value
- }
- hudContent.appendChild(hudText)
- hudContent.appendChild(toggleRunBtn)
- hudContent.appendChild(toggleCanvasBtn)
- hudContent.appendChild(toggleMillisBtn)
- hudContent.appendChild(modeSelect)
- // CLOSE BUTTON
- let closeBtn = document.createElement("button")
- closeBtn.textContent = "Close"
- closeBtn.onclick = () => {
- hud.remove()
- canvas.remove()
- }
- hudContent.appendChild(closeBtn)
- hud.appendChild(titleBar)
- hud.appendChild(hudContent)
- document.body.appendChild(hud)
- //---------------- DRAG SYSTEM ----------------
- let dragging = false
- let offsetX = 0
- let offsetY = 0
- titleBar.addEventListener("mousedown", (e) => {
- dragging = true
- offsetX = e.clientX - hud.offsetLeft
- offsetY = e.clientY - hud.offsetTop
- })
- document.addEventListener("mouseup", () => {
- dragging = false
- })
- document.addEventListener("mousemove", (e) => {
- if (!dragging) return
- hud.style.left = (e.clientX - offsetX) + "px"
- hud.style.top = (e.clientY - offsetY) + "px"
- })
- //---------------- OMEGA ----------------
- function omega(n) {
- num = 1
- a = []
- h = 64
- while (n > h) {
- h = h + h
- }
- while (h != 32) {
- ud = (n * num) % h
- u = 1
- while (ud >= h / 2) {
- u *= 2;
- ud = (ud * 2) % h
- }
- num *= u
- a.push(u)
- h /= 2
- }
- return a
- }
- function infinity(n) {
- return omega(n)
- }
- //---------------- ALPHABET COUNTERS ----------------
- function alphaCounter(n) {
- let s = ""
- n++
- while (n > 0) {
- n--
- s = String.fromCharCode(97 + (n % 26)) + s
- n = Math.floor(n / 26)
- }
- return s
- }
- function toRoman(num) {
- if (num <= 0) return ""
- const romans = [
- ["M", 1000],
- ["CM", 900],
- ["D", 500],
- ["CD", 400],
- ["C", 100],
- ["XC", 90],
- ["L", 50],
- ["XL", 40],
- ["X", 10],
- ["IX", 9],
- ["V", 5],
- ["IV", 4],
- ["I", 1]
- ]
- let res = ""
- for (let [r, val] of romans) {
- while (num >= val) {
- res += r;
- num -= val
- }
- }
- return res
- }
- function lettersNumCounter(n) {
- return alphaCounter(n) + n
- }
- // Base conversions
- function toBase(n, base) {
- return n.toString(base)
- }
- // Fibonacci
- function fibonacci(n) {
- let a = 0,
- b = 1
- if (n === 0) return 0
- for (let i = 1; i < n; i++) {
- let t = a + b;
- a = b;
- b = t
- }
- return b
- }
- // Prime
- function nthPrime(n) {
- let primes = [],
- i = 2
- while (primes.length <= n) {
- let isPrime = true
- for (let p of primes) {
- if (i % p === 0) {
- isPrime = false;
- break
- }
- }
- if (isPrime) primes.push(i)
- i++
- }
- return primes[n]
- }
- // Square, Cube
- function square(n) {
- return n * n
- }
- function cube(n) {
- return n * n * n
- }
- // Factorial
- function factorial(n) {
- return n <= 1 ? 1 : n * factorial(n - 1)
- }
- // Scientific
- function sci(n) {
- return n.toExponential(3)
- }
- // Emoji mapping
- const emojiMap = ["😀", "😁", "😂", "😃", "😄", "😅", "😆", "😉", "😊", "😋"]
- function emojiCounter(n) {
- return emojiMap[n % emojiMap.length]
- }
- // Morse numbers
- const morseMap = ["-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."]
- function morseCounter(n) {
- return n.toString().split("").map(d => morseMap[parseInt(d)]).join(" ")
- }
- //---------------- UPDATE LOOP ----------------
- function update() {
- if (tickerEnabled && d % 7 == 0) {
- t = new Date()
- if (!paused) {
- b = ((t.getTime() - time) / 1000) * step * direction + save
- }
- let n = Math.floor(b)
- let bStr = showMillis ? b.toFixed(3) : n
- // COUNT MODE SELECTION
- let out = ""
- switch (countMode) {
- case "time":
- out = bStr;
- break
- case "integer":
- out = n;
- break
- case "alpha":
- out = alphaCounter(n);
- break
- case "omega":
- out = infinity(n).join();
- break
- case "hex":
- out = n.toString(16);
- break
- case "binary":
- out = n.toString(2);
- break
- case "roman":
- out = toRoman(n);
- break
- case "romanAlpha":
- out = toRoman(n) + " (" + alphaCounter(n) + ")";
- break
- case "lettersNum":
- out = lettersNumCounter(n);
- break
- case "base36":
- out = n.toString(36);
- break
- case "countup":
- out = n;
- break
- case "countdown":
- out = 9999 - n;
- break
- case "octal":
- out = toBase(n, 8);
- break
- case "base7":
- out = toBase(n, 7);
- break
- case "base5":
- out = toBase(n, 5);
- break
- case "romanLower":
- out = toRoman(n).toLowerCase();
- break
- case "romanExtended":
- out = (n > 3999 ? toRoman(3999) + "+" : toRoman(n));
- break
- case "fibonacci":
- out = fibonacci(n);
- break
- case "prime":
- out = nthPrime(n);
- break
- case "square":
- out = square(n);
- break
- case "cube":
- out = cube(n);
- break
- case "factorial":
- out = factorial(n);
- break
- case "scientific":
- out = sci(b);
- break
- case "emoji":
- out = emojiCounter(n);
- break
- case "morse":
- out = morseCounter(n);
- break
- default:
- out = bStr;
- break
- }
- c = out
- // CANVAS MODE
- if (showCanvas) {
- let x = cursor.x
- let y = cursor.y
- if (lastX !== null) {
- cursor.x = lastX
- cursor.y = lastY
- for (let i = 0; i < lastLen; i++) {
- writeChar(" ", 1)
- }
- }
- cursor.x = x
- cursor.y = y
- for (let i = 0; i < c.length; i++) {
- writeChar(c[i], 1)
- }
- ctx.clearRect(0, 0, canvas.width, canvas.height)
- ctx.font = "16px monospace"
- ctx.fillStyle = "#00ff00"
- // Move 1 character to the right
- let px = (x + 1) * 10
- let py = y * 18
- ctx.fillText(c, px, py)
- lastX = x
- lastY = y
- lastLen = c.length
- cursor.x = x
- cursor.y = y
- }
- // HUD MODE
- else {
- ctx.clearRect(0, 0, canvas.width, canvas.height)
- hudText.textContent = c
- }
- }
- d++;
- requestAnimationFrame(update)
- }
- requestAnimationFrame(update)
- //---------------- CHAT COMMANDS ----------------
- w.on("msg", (data) => {
- if (data.nick != "CalculatorBot") return
- if (data.msg.startsWith("save ")) save = Number(data.msg.substring(5)) - b
- if (data.msg === "toggleMillis") showMillis = !showMillis
- if (data.msg === "pauseTimer") paused = true
- if (data.msg === "resumeTimer") paused = false;
- time = new Date().getTime()
- if (data.msg === "resetTimer") b = 0;
- save = 0;
- time = new Date().getTime()
- if (data.msg === "countdown") direction = -1
- if (data.msg === "countup") direction = 1
- if (data.msg === "reverseTimer") direction *= -1
- if (data.msg.startsWith("setTime ")) {
- let val = Number(data.msg.split(" ")[1]);
- if (!isNaN(val)) {
- b = val;
- save = val;
- time = new Date().getTime()
- }
- }
- if (data.msg.startsWith("setStep ")) {
- let val = Number(data.msg.split(" ")[1]);
- if (!isNaN(val)) {
- step = val
- }
- }
- })
- })();
Advertisement