From e86b9908a2b6653e5e4b41453e88057bc4c6d3b8 Mon Sep 17 00:00:00 2001 From: LAX1DUDE Date: Sun, 3 Apr 2022 23:43:58 -0700 Subject: [PATCH] Uploaded Source --- LICENSE | 2 +- README.md | 41 ++ embed.js | 724 +++++++++++++++++++++++++++++++ embed.min.js | 30 ++ icons.png | Bin 0 -> 10053 bytes icons_src/background.png | Bin 0 -> 585 bytes icons_src/certificate_seal.ico | Bin 0 -> 766 bytes icons_src/font.png | Bin 0 -> 2727 bytes icons_src/icons.png | Bin 0 -> 6792 bytes icons_src/key_padlock.ico | Bin 0 -> 1078 bytes icons_src/msg_warning.ico | Bin 0 -> 1398 bytes icons_src/unknown_pack_64x64.png | Bin 0 -> 13498 bytes test.html | 14 + 13 files changed, 810 insertions(+), 1 deletion(-) create mode 100644 README.md create mode 100644 embed.js create mode 100644 embed.min.js create mode 100644 icons.png create mode 100644 icons_src/background.png create mode 100644 icons_src/certificate_seal.ico create mode 100644 icons_src/font.png create mode 100644 icons_src/icons.png create mode 100644 icons_src/key_padlock.ico create mode 100644 icons_src/msg_warning.ico create mode 100644 icons_src/unknown_pack_64x64.png create mode 100644 test.html diff --git a/LICENSE b/LICENSE index 369f2a2..7343f86 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 LAX1DUDE +Copyright (c) 2022 Calder Young Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md new file mode 100644 index 0000000..e6a8350 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# Eaglercraft HTML5 Ping Embed + +### This allows you to easily embed your Eaglercraft server's ping, player list, and MOTD in a \ element in an HTML5 document using the same style as the game's multiplayer screen + +![Eaglercraft HTML5 Ping Embed](https://i.gyazo.com/3db6a206bca69da3545a6083bc8aa7eb.gif) + +### Demo link: [https://g.eags.us/eaglercraft/ping.html](https://g.eags.us/eaglercraft/ping.html) + +# How to install: + +1. Download 'embed.min.js' and 'icons.png' and upload them to your server + +2. Add the script: `` + +3. Create a \ like: `
` + +4. In your Javascript, create a new `ServerEmbed` object. Pass the \ object and a CSS width as parameters: +`var embed = new ServerEmbed(document.getElementById("embed"), "500px");` + +5. Call the `ping` function on the new object: `embed.ping("127.0.0.1:25565");` + + (Replace `127.0.0.1:25565` with the `ip:port` or `ws://` or `wss://` address of your server) + +6. You're done + +## Extra features: + +The `ping` function takes five arguments, four of which are optional: +```javascript +ping(addr, name, forceName, hideAddress, hideCracked) +``` + +- `addr` Is the `ip:port` or `ws://` or `wss://` address of your server + +- `name` *(Optional)* Sets the name to display for the server, if left undefined then the default name displayed for the server is the `server_name:` variable of config.yml of the server being pinged (once the server responds) + +- `forceName` *(Optional)* Sets if the `name` parameter should always be shown as the server's name instead of the pinged server's config.yml `server_name:` sent in the response to the ping. Default is false, so by default the optional `name` parameter is only shown until the server responds with it's configured `server_name:`, which is then displayed instead until the ping is sent again + +- `hideAddress` *(Optional)* Sets if the second line of the server's MOTD **should not display** the `addr` parameter on the canvas while it is still connecting, and then also if it shouldn't display the `addr` when the destination server's response does not specify a second line in it's MOTD. Default is false + +- `hideCracked` *(Optional)* Sets if the warning icon and padlock icon, which indicate if the server uses online mode or not, should be hidden from the embed so nobody can tell if your server is cracked or not. Default is false \ No newline at end of file diff --git a/embed.js b/embed.js new file mode 100644 index 0000000..02a2bdc --- /dev/null +++ b/embed.js @@ -0,0 +1,724 @@ +/* +MIT License + +Copyright (c) 2022 Calder Young + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ +const CHAR_WIDTHS = [ + 1,9,9,8,8,8,8,7,9,8,9,9,8,9,9,9, + 8,8,8,8,9,9,8,9,8,8,8,8,8,9,9,9, + 4,2,5,6,6,6,6,3,5,5,5,6,2,6,2,6, + 6,6,6,6,6,6,6,6,6,6,2,2,5,6,5,6, + 7,6,6,6,6,6,6,6,6,4,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,4,6,4,6,6, + 3,6,6,6,6,6,5,6,6,2,6,5,3,6,6,6, + 6,6,6,6,4,6,6,6,6,6,6,5,2,5,7,6, + 6,6,6,6,6,6,6,6,6,6,6,4,6,3,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,4,6, + 6,3,6,6,6,6,6,6,6,7,6,6,6,2,6,6, + 8,9,9,6,6,6,8,8,6,8,8,8,8,8,6,6, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,6,9,9,9,5,9,9, + 8,7,7,8,7,8,8,8,7,8,8,7,9,9,6,7, + 7,7,7,7,9,6,7,8,7,6,6,9,7,6,7,1 +]; + +const CHAR_SHADOW_BRIGHTNESS = 0.247; + +const SERVER_ASPECT_RATIO = 38.0 / 256.0; + +class ServerEmbed { + + constructor(tag, width) { + this.containerTag = tag; + tag.style.width = width; + tag.style.height = Math.floor(tag.clientWidth * SERVER_ASPECT_RATIO) + "px"; + tag.style.backgroundColor = "black"; + this.canvas = document.createElement("canvas"); + this.canvas.width = tag.clientWidth; + this.canvas.height = tag.clientHeight; + tag.appendChild(this.canvas); + this.ctx = this.canvas.getContext("2d"); + if(!this.ctx) { + throw new Error("CanvasRenderingContext2D is not supported in this browser"); + } + this.ctx.imageSmoothingEnabled = false; + this.tmpCanvas = document.createElement("canvas"); + this.tmpCanvas.width = 64; + this.tmpCanvas.height = 64; + this.tmpCtx = this.tmpCanvas.getContext("2d"); + this.tmpCtx.imageSmoothingEnabled = false; + const self = this; + this.spriteSheet = document.createElement("img"); + this.spriteSheet.addEventListener("load", () => { + self.isSpriteSheetLoaded = true; + setInterval(() => self.redraw(), 50); + }); + this.spriteSheet.src = "icons.png"; + this.socket = null; + this.connected = false; + this.dirty = false; + this.connecting = 0; + this.currentStatus = { + serverName: "", + serverCracked: false, + pingSentTime: 0, + pingToServer: -1, + motdLine1: "", + motdLine2: "", + onlineCount: 0, + maxCount: 0, + players: [] + }; + this.showCracked = true; + this.tooltip = ""; + this.isShowingTooltip = false; + this.isTooltipEnabled = true; + this.tooltipCanvas = document.createElement("canvas"); + this.tooltipCanvas.width = 64; + this.tooltipCanvas.height = 64; + this.tooltipCanvas.style.display = "none"; + this.tooltipCanvas.style.position = "absolute"; + this.tooltipCanvas.style.zIndex = "100"; + this.tooltipCanvas.style.pointerEvents = "none"; + this.tooltipCtx = this.tooltipCanvas.getContext("2d"); + this.tooltipCtx.imageSmoothingEnabled = false; + document.body.appendChild(this.tooltipCanvas); + this.mouseOver = false; + this.mouseX = 0; + this.mouseY = 0; + this.mousePageX = 0; + this.mousePageY = 0; + var mouseMove = (e) => { + self.mouseOver = true; + self.mouseX = e.offsetX / self.canvas.width * 256.0; + self.mouseY = e.offsetY / self.canvas.height * 38.0; + self.mousePageX = e.pageX; + self.mousePageY = e.pageY; + }; + this.canvas.addEventListener("mouseover", mouseMove); + this.canvas.addEventListener("mousemove", mouseMove); + this.canvas.addEventListener("mouseout", (e) => { + self.mouseOver = false; + self.tooltipCanvas.style.display = "none"; + }); + this.lastWidth = 0; + this.redrawTimer = 0; + } + + setShowCracked(b) { + if(b != this.showCracked) { + this.showCracked = b; + this.dirty = true; + } + } + + setShowTooltip(b) { + this.isTooltipEnabled = b; + } + + getPixelX(x) { + return x * this.canvas.width / 256.0; + } + + getPixelY(y) { + return y * this.canvas.height / 38.0; + } + + drawIcon(x, y, w, h, dx, dy, dw, dh) { + if(this.isSpriteSheetLoaded) { + this.ctx.drawImage(this.spriteSheet, x + 0.05, y + 0.05, w - 0.1, h - 0.1, this.getPixelX(dx), + this.getPixelY(dy), this.getPixelX(dw||w), this.getPixelY(dh||h)); + } + } + + drawChar(x, y, ch, italic) { + if(ch >= CHAR_WIDTHS.length) { + ch = 176; + } + if(!italic) { + this.drawIcon(ch % 16 * 8, Math.floor(ch / 16.0) * 8.0, CHAR_WIDTHS[ch], 8, x, y); + }else { + if(this.isSpriteSheetLoaded) { + this.ctx.resetTransform(); + this.ctx.scale(this.canvas.width / 256.0, this.canvas.height / 38.0); + this.ctx.translate(x + 1.1, y); + this.ctx.transform(1, 0, -0.35, 1, 0, 0); + this.ctx.drawImage(this.spriteSheet, ch % 16 * 8, Math.floor(ch / 16.0) * 8.0, + CHAR_WIDTHS[ch] * 0.99, 8 * 0.99, 0, 0, CHAR_WIDTHS[ch], 8); + this.ctx.resetTransform(); + } + } + return CHAR_WIDTHS[ch]; + } + + drawColoredChar(x, y, ch, color, italic) { + if(ch >= CHAR_WIDTHS.length) { + ch = 176; + } + if(!this.isSpriteSheetLoaded) { + return CHAR_WIDTHS[ch]; + } + this.tmpCtx.globalCompositeOperation = "source-over"; + this.tmpCtx.clearRect(0, 0, 8, 8); + this.tmpCtx.imageSmoothingEnabled = false; + this.tmpCtx.drawImage(this.spriteSheet, ch % 16 * 8, Math.floor(ch / 16.0) * 8.0, + CHAR_WIDTHS[ch] * 0.99, 8 * 0.99, 0, 0, CHAR_WIDTHS[ch], 8); + this.tmpCtx.globalCompositeOperation = "source-in"; + this.tmpCtx.fillStyle = color; + this.tmpCtx.fillRect(0, 0, CHAR_WIDTHS[ch], 8); + + if(!italic) { + this.ctx.drawImage(this.tmpCanvas, 0, 0, CHAR_WIDTHS[ch] * 0.99, 8 * 0.99, this.getPixelX(x), + this.getPixelY(y), this.getPixelX(CHAR_WIDTHS[ch]), this.getPixelY(8)); + }else { + this.ctx.resetTransform(); + this.ctx.scale(this.canvas.width / 256.0, this.canvas.height / 38.0); + this.ctx.translate(x + 1.1, y); + this.ctx.transform(1, 0, -0.35, 1, 0, 0); + this.ctx.drawImage(this.tmpCanvas, 0, 0, CHAR_WIDTHS[ch] * 0.99, 8 * 0.99, 0, 0, CHAR_WIDTHS[ch], 8); + this.ctx.resetTransform(); + } + return CHAR_WIDTHS[ch]; + } + + drawCharLine(x, y, w, clr) { + this.ctx.fillStyle = clr; + this.ctx.fillRect(this.getPixelX(x), this.getPixelY(y), this.getPixelX(w + 0.02), this.getPixelY(1)); + } + + makeColor(r, g, b) { + return "rgba(" + Math.floor(r) + "," + Math.floor(g) + "," + Math.floor(b) + ",1.0)"; + } + + getStringWidth(txt, escapeChar) { + if(!escapeChar) { + escapeChar = 167; + }else { + escapeChar = escapeChar.charCodeAt(0); + } + var j = 0; + for(var i = 0; i < txt.length; ++i) { + var c = txt.charCodeAt(i); + if(c == escapeChar) { + i += 2; + }else { + if(c < CHAR_WIDTHS.length) { + j += CHAR_WIDTHS[c]; + }else { + j += 6; + } + } + } + return j; + } + + drawString(x, y, txt, r, g, b, shadow, randomSeed, escapeChar) { + var escapeCharChar = escapeChar; + if(!escapeChar) { + escapeChar = 167; + }else { + escapeChar = escapeChar.charCodeAt(0); + } + var startX = x; + var startY = y; + if(shadow) { + ++x; + ++y; + } + if(!randomSeed) { + randomSeed = 3492589035; + } + var readFormat = false; + var cr = r; + var cg = g; + var cb = b; + var obfuscate = false; var bold = false; var strikethrough = false; + var underline = false; var italic = false; + for(var i = 0; i < txt.length; ++i) { + var c = txt.charCodeAt(i); + if(c == escapeChar) { // color code symbol + readFormat = true; + continue; + } + if(readFormat) { + if(c == 48) { // black (0) + cr = cg = cb = 0; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 49) { // dark_blue (1) + cr = cg = 0; + cb = 170; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 50) { // dark_green (2) + cr = cb = 0; + cg = 170; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 51) { // dark_aqua (3) + cr = 0; + cg = cb = 170; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 52) { // dark_red (4) + cr = 170; + cg = cb = 0; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 53) { // dark_purple (5) + cr = cb = 170; + cg = 0; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 54) { // gold (6) + cr = 255; + cg = 170; + cb = 0; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 55) { // gray (7) + cr = cg = cb = 170; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 56) { // dark_gray (8) + cr = cg = cb = 85; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 57) { // blue (9) + cr = cg = 85; + cb = 255; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 97) { // green (a) + cr = cb = 85; + cg = 255; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 98) { // aqua (b) + cr = 85; + cg = cb = 255; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 99) { // red (c) + cg = cb = 85; + cr = 255; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 100) { // light_purple (d) + cr = cb = 255; + cg = 85; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 101) { // yellow (e) + cr = cg = 255; + cb = 85; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 102) { // white (f) + cr = cg = cb = 255; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + }else if(c == 107) { // obfuscated (k) + readFormat = false; + obfuscate = true; + continue; + }else if(c == 108) { // bold (l) + readFormat = false; + bold = true; + continue; + }else if(c == 109) { // strikethrough (m) + readFormat = false; + strikethrough = true; + continue; + }else if(c == 110) { // underline (n) + readFormat = false; + underline = true; + continue; + }else if(c == 111) { // italic (o) + readFormat = false; + italic = true; + continue; + }else if(c == 114) { // reset (r) + cr = r; + cg = g; + cb = b; + readFormat = obfuscate = bold = + strikethrough = underline = italic = false; + continue; + } + readFormat = false; + continue; + } + if(obfuscate) { + this.dirty = true; + var w = 6 + if(c < CHAR_WIDTHS.length) { + w = CHAR_WIDTHS[c]; + } + var j = 0; + var newChar = 0; + do { + var t = randomSeed += 0x6D2B79F5; + t = Math.imul(t ^ t >>> 15, t | 1); + t ^= t + Math.imul(t ^ t >>> 7, t | 61); + newChar = (((t ^ t >>> 14) >>> 0) / 429496) & 255; + }while((newChar == c || CHAR_WIDTHS[newChar] != w) && ++j < 1000); + c = newChar; + } + if(shadow) { + var ccc = this.makeColor(cr * CHAR_SHADOW_BRIGHTNESS, + cg * CHAR_SHADOW_BRIGHTNESS, cb * CHAR_SHADOW_BRIGHTNESS); + var ox = x; + var ow = 0; + if(bold) this.drawColoredChar(x + 1, y + 1, c, ccc, italic); + x += (ow = this.drawColoredChar(x, y, c, ccc, italic)); + if(bold) { + ++x; + ++ow; + } + if(strikethrough) this.drawCharLine(ox, y + 4, ow, ccc); + if(underline) this.drawCharLine(ox, y + 8, ow, ccc); + }else { + if(cr >= 250 && cg >= 250 && cb >= 250) { + var ox = x; + var ow = 0; + if(bold) this.drawChar(x + 0.5, y + 0.5, c, italic); + x += (ow = this.drawChar(x, y, c, italic)); + if(bold) { + ++x; + ++ow; + } + if(strikethrough) this.drawCharLine(ox, y + 4, ow, "#FFFFFF"); + if(underline) this.drawCharLine(ox, y + 8, ow, "#FFFFFF"); + }else { + var ccc = this.makeColor(cr,cg,cb); + var ox = x; + var ow = 0; + if(bold) this.drawColoredChar(x + 0.5, y + 0.5, c, ccc, italic); + x += (ow = this.drawColoredChar(x, y, c, ccc, italic)); + if(bold) { + ++x; + ++ow; + } + if(strikethrough) this.drawCharLine(ox, y + 4, ow, ccc); + if(underline) this.drawCharLine(ox, y + 8, ow, ccc); + } + } + if(x > 250.0) { + break; + } + } + if(shadow) { + this.drawString(startX, startY, txt, r, g, b, false, randomSeed, escapeCharChar); + } + } + + redraw() { + if(this.dirty || (this.mouseOver && ++this.redrawTimer % 6 == 0) || this.canvas.width != this.containerTag.clientWidth) { + this.dirty = false; + if(this.canvas.width != this.containerTag.clientWidth) { + this.containerTag.style.height = Math.floor(this.containerTag.clientWidth * SERVER_ASPECT_RATIO) + "px"; + this.canvas.width = this.containerTag.clientWidth; + this.canvas.height = this.containerTag.clientHeight; + } + var tooltipNewArray = []; + this.ctx.imageSmoothingEnabled = false; + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + this.ctx.fillStyle = "#101010"; + this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height); + this.ctx.strokeStyle = "#808080"; + this.ctx.lineWidth = this.getPixelX(1.0); + this.ctx.strokeRect(this.ctx.lineWidth / 2, this.ctx.lineWidth / 2,this.canvas.width - this.ctx.lineWidth,this.canvas.height - this.ctx.lineWidth); + + if(!this.iconCanvas) { + this.drawIcon(128, 0, 64, 64, 4, 4, 30, 30); + }else { + this.ctx.drawImage(this.iconCanvas, 0, 0, 64, 64, this.getPixelX(4), + this.getPixelY(4), this.getPixelX(30), this.getPixelY(30)); + } + + var v = Date.now(); + var drawAddress = false; + + this.drawString(38, 4, this.currentStatus.serverName, 255, 255, 255, true, v); + if(this.currentStatus.pingToServer >= 0) { + if(this.currentStatus.motdLine1.length > 0) { + this.drawString(38, 15, ""+this.currentStatus.motdLine1, 255, 255, 255, true, v); + } + if(this.currentStatus.motdLine2.length > 0) { + this.drawString(38, 27, ""+this.currentStatus.motdLine2, 255, 255, 255, true, v); + }else { + drawAddress = true; + } + }else if(v - this.connecting < 7000) { + this.dirty = true; + var dots = Math.floor(v / 300) % 4; + this.drawString(38, 15, "Connecting" + (dots > 0 ? "." : "") + (dots > 1 ? "." : "") + (dots > 2 ? "." : ""), 128, 128, 128, true, v); + drawAddress = true; + }else { + this.drawString(38, 15, "No Connection", 96, 96, 96, true, v); + drawAddress = true; + } + if(drawAddress && this.showAddress) { + this.drawString(38, 27, this.originalAddress, 48, 48, 48, true, v); + } + var mouseIsOverPing = this.mouseOver && this.mouseX >= 233 && this.mouseX <= 256 && this.mouseY >= 1 && this.mouseY <= 11; + var mouseIsOverPlayers = false; + if(this.currentStatus.pingToServer >= 0) { + if(mouseIsOverPing) tooltipNewArray = [""+this.currentStatus.pingToServer+"ms"]; + var i = 5; + if(this.currentStatus.pingToServer < 150) i = 0; + else if(this.currentStatus.pingToServer < 300) i = 1; + else if(this.currentStatus.pingToServer < 600) i = 2; + else if(this.currentStatus.pingToServer < 1000) i = 3; + else i = 4; + this.drawIcon(128, 80 + i * 8, 10, 7, 243, 3); + var onlineStr = "" + this.currentStatus.onlineCount + "/" + this.currentStatus.maxCount; + var xx = 253 - this.getStringWidth(onlineStr); + mouseIsOverPlayers = !mouseIsOverPing && this.mouseOver && this.mouseX >= xx - 5 && this.mouseX <= 256 + && this.mouseY >= 12 && this.mouseY <= 23; + this.drawString(xx, 14, onlineStr, 128, 128, 128, true); + if(mouseIsOverPlayers) { + tooltipNewArray = this.currentStatus.players; + } + }else { + if(v - this.connecting < 7000 || this.connected) { + this.dirty = true; + if(mouseIsOverPing) tooltipNewArray = ["Connecting..."]; + this.drawIcon(138, 80 + Math.abs(Math.floor(v / 100.0) % 8 - 4) * 8, 10, 7, 243, 3); + }else { + if(mouseIsOverPing) tooltipNewArray = ["No Connection"]; + this.drawIcon(128, 120, 10, 7, 243, 3); + } + } + if(this.showCracked && this.currentStatus.pingToServer >= 0) { + if(this.currentStatus.serverCracked) { + this.drawIcon(144, 64, 16, 16, 243, 25, 10, 10); + }else { + this.drawIcon(176, 96, 16, 16, 243, 25, 11, 11); + } + if(!mouseIsOverPlayers && this.mouseOver && this.mouseX >= 239 && this.mouseX <= 256 + && this.mouseY >= 22 && this.mouseY <= 36) { + if(this.currentStatus.serverCracked) { + tooltipNewArray = ["Server is cracked"]; + }else { + tooltipNewArray = ["Server has login"]; + } + } + } + if(!tooltipNewArray || !this.mouseOver || tooltipNewArray.length == 0) { + this.tooltipCanvas.style.display = "none"; + }else { + this.showTooltip(tooltipNewArray); + } + } + } + + ping(addr, name, forceName, hideAddress, hideCracked) { + if(!name) { + name = "Minecraft Server"; + this.showQueryName = (typeof forceName === "undefined") || !forceName; + }else { + this.showQueryName = (typeof forceName !== "undefined") && !forceName; + } + this.defaultName = name; + this.showAddress = !hideAddress; + this.originalAddress = addr; + if(typeof hideCracked !== "undefined") { + this.showCracked = !hideCracked; + } + if(addr.indexOf("ws://") != 0 && addr.indexOf("wss://") != 0) { + addr = (window.location.href.indexOf("https:") == 0 ? "wss" : "ws") + "://" + addr; + } + if(this.socket != null && this.connected) { + this.socket.close(); + } + this.currentStatus = { + serverName: name, + serverCracked: false, + pingSentTime: Date.now(), + pingToServer: -1, + motdLine1: "Connecting...", + motdLine2: "", + onlineCount: 0, + maxCount: 0, + players: [] + }; + this.dirty = true; + if(this.connected || this.connecting > 0) { + this.socket.close(); + this.connected = false; + this.connecting = 0; + this.redraw(); + } + this.connecting = Date.now(); + const self = this; + this.socket = new WebSocket(addr); + this.socket.binaryType = "arraybuffer"; + this.socket.onopen = () => { + self.socket.send("Accept: MOTD"); + self.connecting = 0; + self.connected = true; + self.dirty = true; + }; + this.socket.onmessage = (e) => { + if(e.data) { + if(typeof e.data === "string") { + try { + var dat = JSON.parse(e.data); + if(dat["type"].toLowerCase() === "motd") { + self.dirty = true; + if(self.currentStatus.pingSentTime > 0) { + self.currentStatus.pingToServer = Date.now() - self.currentStatus.pingSentTime; + self.currentStatus.pingSentTime = 0; + } + if(this.showQueryName) { + self.currentStatus.serverName = dat["name"]; + }else { + self.currentStatus.serverName = this.defaultName; + } + self.currentStatus.serverCracked = dat["cracked"]; + var lns = dat["data"]["motd"]; + if(lns && lns.length > 0) { + self.currentStatus.motdLine1 = lns[0]; + if(lns.length > 1) { + self.currentStatus.motdLine2 = lns[1]; + } + } + self.currentStatus.onlineCount = dat["data"]["online"]; + self.currentStatus.maxCount = dat["data"]["max"]; + self.currentStatus.players = dat["data"]["players"]||[]; + } + }catch(e) { + self.currentStatus.motdLine1 = "ERROR: " + e; + } + }else { + var dat = new Uint8Array(e.data); + if(dat.length == 64*64*4) { + this.updateIconFromBytes(dat); + this.dirty = true; + } + } + } + }; + this.socket.onclose = (e) => { + self.connecting = 0; + self.connected = false; + self.dirty = true; + }; + this.socket.onerror = (e) => { + if(self.connected || self.connecting > 0) { + self.socket.close(); + } + self.connecting = 0; + self.connected = false; + self.dirty = true; + }; + } + + isActive() { + return self.connecting > 0 || self.connected; + } + + setTooltip(ttList) { + if(this.isTooltipEnabled) { + var tst = ttList.join(); + if(tst !== this.tooltip || this.lastWidth !== this.canvas.width) { + var listWidth = 0; + var listHeight = ttList.length * 9; + for(var i = 0; i < ttList.length; ++i) { + listWidth = Math.max(listWidth, this.getStringWidth(ttList[i])); + } + listWidth += 6; + listHeight += 3; + this.tooltipCanvas.width = this.getPixelX(listWidth); + this.tooltipCanvas.height = this.getPixelY(listHeight); + var mainCtx = this.ctx; + this.ctx = this.tooltipCtx; + this.ctx.imageSmoothingEnabled = false; + this.ctx.clearRect(0, 0, this.tooltipCanvas.width, this.tooltipCanvas.height); + this.ctx.fillStyle = "#101010E0"; + this.ctx.fillRect(0, 0, this.tooltipCanvas.width, this.tooltipCanvas.height); + for(var i = 0; i < ttList.length; ++i) { + this.drawString(3, (2 + i*9), ttList[i], 256, 256, 256, true); + } + this.ctx = mainCtx; + this.tooltip = tst; + this.lastWidth = this.canvas.width; + } + } + } + + showTooltip(ttList) { + this.dirty = true; + if(!this.mouseOver) { + this.tooltipCanvas.style.display = "none"; + return; + } + this.setTooltip(ttList); + this.tooltipCanvas.style.display = "block"; + var x = this.mousePageX + this.getPixelX(4); + var y = this.mousePageY - this.getPixelY(9); + if(this.mousePageX + this.tooltipCanvas.width + 2 > window.innerWidth) { + x = window.innerWidth - this.tooltipCanvas.width - 2; + } + if(this.mousePageY + this.tooltipCanvas.height + 2 > window.innerHeight) { + y = window.innerHeight - this.tooltipCanvas.height - 2; + if(y < 0) { + y = 0; + } + } + this.tooltipCanvas.style.left = x + "px"; + this.tooltipCanvas.style.top = y + "px"; + } + + updateIconFromBytes(arr) { + if(!this.iconCanvas) { + this.iconCanvas = document.createElement("canvas"); + this.iconCanvas.width = 64; + this.iconCanvas.height = 64; + this.iconContext = this.iconCanvas.getContext("2d"); + } + var dat = this.iconContext.createImageData(64, 64); + for(var i = 0, l = 64*64*4; i < l; ++i) { + dat.data[i] = arr[i]; + } + this.iconContext.putImageData(dat, 0, 0); + } + +} + diff --git a/embed.min.js b/embed.min.js new file mode 100644 index 0000000..634d85f --- /dev/null +++ b/embed.min.js @@ -0,0 +1,30 @@ +// Copyright (c) 2022 Calder Young +var CHAR_WIDTHS=[1,9,9,8,8,8,8,7,9,8,9,9,8,9,9,9,8,8,8,8,9,9,8,9,8,8,8,8,8,9,9,9,4,2,5,6,6,6,6,3,5,5,5,6,2,6,2,6,6,6,6,6,6,6,6,6,6,6,2,2,5,6,5,6,7,6,6,6,6,6,6,6,6,4,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,4,6,4,6,6,3,6,6,6,6,6,5,6,6,2,6,5,3,6,6,6,6,6,6,6,4,6,6,6,6,6,6,5,2,5,7,6,6,6,6,6,6,6,6,6,6,6,6,4,6,3,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,4,6,6,3,6,6,6,6,6,6,6,7,6,6,6,2,6,6,8,9,9,6,6,6,8,8,6,8,8,8,8,8,6,6,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,6,9,9,9,5,9,9,8,7,7,8,7,8,8,8,7,8,8,7,9,9,6,7,7,7, +7,7,9,6,7,8,7,6,6,9,7,6,7,1],CHAR_SHADOW_BRIGHTNESS=.247,SERVER_ASPECT_RATIO=.1484375,ServerEmbed=function(a,c){this.containerTag=a;a.style.width=c;a.style.height=Math.floor(a.clientWidth*SERVER_ASPECT_RATIO)+"px";a.style.backgroundColor="black";this.canvas=document.createElement("canvas");this.canvas.width=a.clientWidth;this.canvas.height=a.clientHeight;a.appendChild(this.canvas);this.ctx=this.canvas.getContext("2d");if(!this.ctx)throw Error("CanvasRenderingContext2D is not supported in this browser"); +this.ctx.imageSmoothingEnabled=!1;this.tmpCanvas=document.createElement("canvas");this.tmpCanvas.width=64;this.tmpCanvas.height=64;this.tmpCtx=this.tmpCanvas.getContext("2d");this.tmpCtx.imageSmoothingEnabled=!1;var b=this;this.spriteSheet=document.createElement("img");this.spriteSheet.addEventListener("load",function(){b.isSpriteSheetLoaded=!0;setInterval(function(){return b.redraw()},50)});this.spriteSheet.src="icons.png";this.socket=null;this.dirty=this.connected=!1;this.connecting=0;this.currentStatus= +{serverName:"",serverCracked:!1,pingSentTime:0,pingToServer:-1,motdLine1:"",motdLine2:"",onlineCount:0,maxCount:0,players:[]};this.showCracked=!0;this.tooltip="";this.isShowingTooltip=!1;this.isTooltipEnabled=!0;this.tooltipCanvas=document.createElement("canvas");this.tooltipCanvas.width=64;this.tooltipCanvas.height=64;this.tooltipCanvas.style.display="none";this.tooltipCanvas.style.position="absolute";this.tooltipCanvas.style.zIndex="100";this.tooltipCanvas.style.pointerEvents="none";this.tooltipCtx= +this.tooltipCanvas.getContext("2d");this.tooltipCtx.imageSmoothingEnabled=!1;document.body.appendChild(this.tooltipCanvas);this.mouseOver=!1;this.mousePageY=this.mousePageX=this.mouseY=this.mouseX=0;var g=function(e){b.mouseOver=!0;b.mouseX=e.offsetX/b.canvas.width*256;b.mouseY=e.offsetY/b.canvas.height*38;b.mousePageX=e.pageX;b.mousePageY=e.pageY};this.canvas.addEventListener("mouseover",g);this.canvas.addEventListener("mousemove",g);this.canvas.addEventListener("mouseout",function(e){b.mouseOver= +!1;b.tooltipCanvas.style.display="none"});this.redrawTimer=this.lastWidth=0};ServerEmbed.prototype.setShowCracked=function(a){a!=this.showCracked&&(this.showCracked=a,this.dirty=!0)};ServerEmbed.prototype.setShowTooltip=function(a){this.isTooltipEnabled=a};ServerEmbed.prototype.getPixelX=function(a){return a*this.canvas.width/256};ServerEmbed.prototype.getPixelY=function(a){return a*this.canvas.height/38}; +ServerEmbed.prototype.drawIcon=function(a,c,b,g,e,y,f,w){this.isSpriteSheetLoaded&&this.ctx.drawImage(this.spriteSheet,a+.05,c+.05,b-.1,g-.1,this.getPixelX(e),this.getPixelY(y),this.getPixelX(f||b),this.getPixelY(w||g))}; +ServerEmbed.prototype.drawChar=function(a,c,b,g){b>=CHAR_WIDTHS.length&&(b=176);g?this.isSpriteSheetLoaded&&(this.ctx.resetTransform(),this.ctx.scale(this.canvas.width/256,this.canvas.height/38),this.ctx.translate(a+1.1,c),this.ctx.transform(1,0,-.35,1,0,0),this.ctx.drawImage(this.spriteSheet,b%16*8,8*Math.floor(b/16),.99*CHAR_WIDTHS[b],7.92,0,0,CHAR_WIDTHS[b],8),this.ctx.resetTransform()):this.drawIcon(b%16*8,8*Math.floor(b/16),CHAR_WIDTHS[b],8,a,c);return CHAR_WIDTHS[b]}; +ServerEmbed.prototype.drawColoredChar=function(a,c,b,g,e){b>=CHAR_WIDTHS.length&&(b=176);if(!this.isSpriteSheetLoaded)return CHAR_WIDTHS[b];this.tmpCtx.globalCompositeOperation="source-over";this.tmpCtx.clearRect(0,0,8,8);this.tmpCtx.imageSmoothingEnabled=!1;this.tmpCtx.drawImage(this.spriteSheet,b%16*8,8*Math.floor(b/16),.99*CHAR_WIDTHS[b],7.92,0,0,CHAR_WIDTHS[b],8);this.tmpCtx.globalCompositeOperation="source-in";this.tmpCtx.fillStyle=g;this.tmpCtx.fillRect(0,0,CHAR_WIDTHS[b],8);e?(this.ctx.resetTransform(), +this.ctx.scale(this.canvas.width/256,this.canvas.height/38),this.ctx.translate(a+1.1,c),this.ctx.transform(1,0,-.35,1,0,0),this.ctx.drawImage(this.tmpCanvas,0,0,.99*CHAR_WIDTHS[b],7.92,0,0,CHAR_WIDTHS[b],8),this.ctx.resetTransform()):this.ctx.drawImage(this.tmpCanvas,0,0,.99*CHAR_WIDTHS[b],7.92,this.getPixelX(a),this.getPixelY(c),this.getPixelX(CHAR_WIDTHS[b]),this.getPixelY(8));return CHAR_WIDTHS[b]}; +ServerEmbed.prototype.drawCharLine=function(a,c,b,g){this.ctx.fillStyle=g;this.ctx.fillRect(this.getPixelX(a),this.getPixelY(c),this.getPixelX(b+.02),this.getPixelY(1))};ServerEmbed.prototype.makeColor=function(a,c,b){return"rgba("+Math.floor(a)+","+Math.floor(c)+","+Math.floor(b)+",1.0)"};ServerEmbed.prototype.getStringWidth=function(a,c){c=c?c.charCodeAt(0):167;for(var b=0,g=0;g>>15,v|1);v^=v+Math.imul(v^v>>>7,v|61);v=((v^v>>>14)>>>0)/429496&255}while((v==d||CHAR_WIDTHS[v]!=x)&&1E3>++z);d=v}f?(x=this.makeColor(p*CHAR_SHADOW_BRIGHTNESS,q*CHAR_SHADOW_BRIGHTNESS,r*CHAR_SHADOW_BRIGHTNESS),z=a,k&&this.drawColoredChar(a+1,c+1,d,x,l),a+=d=this.drawColoredChar(a,c,d,x,l),k&&(++a,++d),m&&this.drawCharLine(z,c+4,d,x),n&&this.drawCharLine(z,c+8,d,x)):250<=p&&250<=q&&250<=r?(z=a,k&&this.drawChar(a+.5,c+.5,d,l),a+=d=this.drawChar(a, +c,d,l),k&&(++a,++d),m&&this.drawCharLine(z,c+4,d,"#FFFFFF"),n&&this.drawCharLine(z,c+8,d,"#FFFFFF")):(x=this.makeColor(p,q,r),z=a,k&&this.drawColoredChar(a+.5,c+.5,d,x,l),a+=d=this.drawColoredChar(a,c,d,x,l),k&&(++a,++d),m&&this.drawCharLine(z,c+4,d,x),n&&this.drawCharLine(z,c+8,d,x));if(250c-this.connecting?(this.dirty=!0,b=Math.floor(c/300)%4,this.drawString(38,15,"Connecting"+(0=this.mouseX&&1<=this.mouseY&&11>=this.mouseY;var g=!1;if(0<=this.currentStatus.pingToServer){b&&(a=[""+this.currentStatus.pingToServer+"ms"]);this.drawIcon(128,80+8*(150>this.currentStatus.pingToServer?0:300>this.currentStatus.pingToServer?1:600>this.currentStatus.pingToServer?2:1E3>this.currentStatus.pingToServer?3:4),10,7,243,3);c=""+this.currentStatus.onlineCount+"/"+this.currentStatus.maxCount;var e= +253-this.getStringWidth(c);g=!b&&this.mouseOver&&this.mouseX>=e-5&&256>=this.mouseX&&12<=this.mouseY&&23>=this.mouseY;this.drawString(e,14,c,128,128,128,!0);g&&(a=this.currentStatus.players)}else 7E3>c-this.connecting||this.connected?(this.dirty=!0,b&&(a=["Connecting..."]),this.drawIcon(138,80+8*Math.abs(Math.floor(c/100)%8-4),10,7,243,3)):(b&&(a=["No Connection"]),this.drawIcon(128,120,10,7,243,3));this.showCracked&&0<=this.currentStatus.pingToServer&&(this.currentStatus.serverCracked?this.drawIcon(144, +64,16,16,243,25,10,10):this.drawIcon(176,96,16,16,243,25,11,11),!g&&this.mouseOver&&239<=this.mouseX&&256>=this.mouseX&&22<=this.mouseY&&36>=this.mouseY&&(a=this.currentStatus.serverCracked?["Server is cracked"]:["Server has login"]));a&&this.mouseOver&&0!=a.length?this.showTooltip(a):this.tooltipCanvas.style.display="none"}}; +ServerEmbed.prototype.ping=function(a,c,b,g,e){var y=this;c?this.showQueryName="undefined"!==typeof b&&!b:(c="Minecraft Server",this.showQueryName="undefined"===typeof b||!b);this.defaultName=c;this.showAddress=!g;this.originalAddress=a;"undefined"!==typeof e&&(this.showCracked=!e);0!=a.indexOf("ws://")&&0!=a.indexOf("wss://")&&(a=(0==window.location.href.indexOf("https:")?"wss":"ws")+"://"+a);null!=this.socket&&this.connected&&this.socket.close();this.currentStatus={serverName:c,serverCracked:!1, +pingSentTime:Date.now(),pingToServer:-1,motdLine1:"Connecting...",motdLine2:"",onlineCount:0,maxCount:0,players:[]};this.dirty=!0;if(this.connected||0window.innerWidth&&(a=window.innerWidth-this.tooltipCanvas.width-2);this.mousePageY+this.tooltipCanvas.height+2>window.innerHeight&&(c=window.innerHeight-this.tooltipCanvas.height-2,0>c&&(c=0));this.tooltipCanvas.style.left=a+"px";this.tooltipCanvas.style.top= +c+"px"}else this.tooltipCanvas.style.display="none"};ServerEmbed.prototype.updateIconFromBytes=function(a){this.iconCanvas||(this.iconCanvas=document.createElement("canvas"),this.iconCanvas.width=64,this.iconCanvas.height=64,this.iconContext=this.iconCanvas.getContext("2d"));for(var c=this.iconContext.createImageData(64,64),b=0;16384>b;++b)c.data[b]=a[b];this.iconContext.putImageData(c,0,0)}; \ No newline at end of file diff --git a/icons.png b/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..987ff8594a683607ff1d83e1d8fe60f93de66d43 GIT binary patch literal 10053 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 XTRSwL`Zxq!00000NkvXXu0mjf|6C1N literal 0 HcmV?d00001 diff --git a/icons_src/certificate_seal.ico b/icons_src/certificate_seal.ico new file mode 100644 index 0000000000000000000000000000000000000000..a863cf5475e9b213ac77a82305029e2f15ec06f3 GIT binary patch literal 766 zcmcJNJyOFk5QU!uGnBC#GA=S>Ql;YxoXL%xN+v0sE=j4|m=jQ^q=GI$<8pZ`Srbi2 z2~XNxeY^gVR|YbUs>a%a5rOd+?~xtO_3TJ?`8hFnD3dy}Bg&)<%=cPeFQOiRdO^0_mg=)8CgjIJ zBBeXzWGjtG$K=epyvACFVQ1|w@Hd$n)Xi2dA6Zep%xapl6oq)+MoD0Qb#Q-DzkJ>W zo2@a8X}YE{{{4f|(V4;8Yx}Xu?NTTG(R|uJqVH$yuaAh|I!68jr<2J0Yp|PVknI-a_o{J+@`XYD#! literal 0 HcmV?d00001 diff --git a/icons_src/font.png b/icons_src/font.png new file mode 100644 index 0000000000000000000000000000000000000000..0b5144d3241f21125fc5d5f8e0dc15bffa321d59 GIT binary patch literal 2727 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 literal 0 HcmV?d00001 diff --git a/icons_src/icons.png b/icons_src/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..10f43737a30253de8330d59981ad5ab74766364c GIT binary patch literal 6792 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 literal 0 HcmV?d00001 diff --git a/icons_src/key_padlock.ico b/icons_src/key_padlock.ico new file mode 100644 index 0000000000000000000000000000000000000000..d5c79684524bece94befec7aa9228be28486f8cb GIT binary patch literal 1078 zcmbVLy^7mF5dM4$XyG986WqB9R|*uc!G-Q&@&E!CyKsdDTu9x%N+3mwE21tEe)L9k{UhW)+`&iIXC;`gVT4nbm4{1k7-O#bQqV44*H67Xaq-(Z87i&okhLu?2BU zXkHTLo)-c5Kx9;$X<`@#Y9(TN5TjZIhlX@IC;8K$vCV0qF|MgbSux&OnC5;ISJLm` zj{Zh8!MnyLxl=yxSpO@Zya^raPk7e%C;T7vM%Q~%&-JEyu4kM~Jon>UnRs-4u=a9H zNbmPHgt6cq_vc+`Tk8rQP7E6{!3FZptdf-89zu)OW!vpmvaNXQLL<2Y>1DY}eACnC z0WHf4-WqRVg&&S3C;EMi=JM#9(Byq@)<+*c1|Hhvo4yxw;`5d{)*B#ut3{)zoip|* z>o?WiL^FAP|N4f-x{tK#7b*KE5wMrmXG6t&Oi#DX~XxzIi@GQNmCO^e{5@n3zO8o1;Z zwG&jQ3;T!9bBfH%w2&GlRnj!+>Xh^nS<+d-30%Yyca=1HuX+@wyjpyeb{Ud%o0AB#|2l5JS1$?f7-Ol3&@^6p8K{>=%LOPjI z`*$-288LImCz}W%&?^wrA2F&$@TV?4(DW-KU$MS7wCpOz)OuXmx$loFI$oMT`B?Y` z-&0;=o9HqGDey1Yjdfz*eAUFHnCHu0SVzu&jiL%3*bk zLfAN_ZH&`C#<`1eiSdASooh;3c24e3uh%<2aYT+X5p#DXmTo!;*BJJU?cbwq9oQ_9 z_&_bpKTsvS0<&-iUb&lY;!cFXoe9RB3IIM4w3sdAD7!XmSXL-5OnF3&E-V~Exbl1i zt|o!2<9QLr^AUUp+}+8sI{MWtU*MRYAl9lheVJX^A zR%7=0dmW5l(ZIiIvptTDJiiGlYx=>m*HFhn;Z($OOi(y^IpC$`Bd`WcteCjK1qFep RJ_&p`v#4IL(Z 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 literal 0 HcmV?d00001 diff --git a/test.html b/test.html new file mode 100644 index 0000000..11f9756 --- /dev/null +++ b/test.html @@ -0,0 +1,14 @@ + + +Eaglercraft Server Embed Test + + + + +
+ + \ No newline at end of file