<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.you107657.duckdns.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadgets%2FdiscordTemplate%2Fmain.js</id>
	<title>MediaWiki:Gadgets/discordTemplate/main.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.you107657.duckdns.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadgets%2FdiscordTemplate%2Fmain.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.you107657.duckdns.org/index.php?title=MediaWiki:Gadgets/discordTemplate/main.js&amp;action=history"/>
	<updated>2026-09-27T01:25:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.you107657.duckdns.org/index.php?title=MediaWiki:Gadgets/discordTemplate/main.js&amp;diff=12530&amp;oldid=prev</id>
		<title>imported&gt;Merge: merge.py</title>
		<link rel="alternate" type="text/html" href="https://wiki.you107657.duckdns.org/index.php?title=MediaWiki:Gadgets/discordTemplate/main.js&amp;diff=12530&amp;oldid=prev"/>
		<updated>2026-09-25T10:55:52Z</updated>

		<summary type="html">&lt;p&gt;merge.py&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:55, 25 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key tensura:diff:1.41:old-4713:rev-12530 --&gt;
&lt;/table&gt;</summary>
		<author><name>imported&gt;Merge</name></author>
	</entry>
	<entry>
		<id>https://wiki.you107657.duckdns.org/index.php?title=MediaWiki:Gadgets/discordTemplate/main.js&amp;diff=4713&amp;oldid=prev</id>
		<title>imported&gt;Merge: merge.py</title>
		<link rel="alternate" type="text/html" href="https://wiki.you107657.duckdns.org/index.php?title=MediaWiki:Gadgets/discordTemplate/main.js&amp;diff=4713&amp;oldid=prev"/>
		<updated>2026-09-25T10:55:52Z</updated>

		<summary type="html">&lt;p&gt;merge.py&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * DiscordCompact.js&lt;br /&gt;
 * ----------------------&lt;br /&gt;
 * A very simple script to display a Discord widget.&lt;br /&gt;
 * Version 0.0.2&lt;br /&gt;
 * https://support.wiki.gg/wiki/DiscordCompact&lt;br /&gt;
 * ----------------------&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$(function() {&lt;br /&gt;
	var widget = $(&amp;quot;#content #discord-compact-widget&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Bail out if we didn&amp;#039;t find a widget.&lt;br /&gt;
    if (!widget.length) return;&lt;br /&gt;
&lt;br /&gt;
	var id = widget.attr(&amp;quot;data-id&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	// Ensure that the id is not blank.&lt;br /&gt;
	if (id === &amp;quot;&amp;quot;) throw new Error(&amp;quot;DiscordCompact has a blank server id!&amp;quot;);&lt;br /&gt;
	// Ensure that the id consists only of numbers and is at least 17 characters long.&lt;br /&gt;
	if (!new RegExp(&amp;quot;^[0-9]{17}[0-9]+$&amp;quot;).test(id)) throw new Error(&amp;quot;DiscordCompact has an invalid server id!&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	var apiBase = &amp;quot;https://discord.com/api/guilds/&amp;quot; + id;&lt;br /&gt;
	// Get some information about the server, such as online member count and invite url.&lt;br /&gt;
	// This also tells us if the server exists or has widgets disabled, so we look out for that too.&lt;br /&gt;
	$.ajax(apiBase + &amp;quot;/widget.json&amp;quot;).fail(function(req){&lt;br /&gt;
        if (!req.responseJSON) throw new Error(&amp;quot;DiscordCompact encountered an unknown error whilst fetching widget.json (status: &amp;quot; + req.status);&lt;br /&gt;
		switch (req.responseJSON.code) {&lt;br /&gt;
            case 10004:&lt;br /&gt;
                throw new Error(&amp;quot;DiscordCompact has a valid server id, but no such server exists!&amp;quot;);&lt;br /&gt;
            case 50004:&lt;br /&gt;
                throw new Error(&amp;quot;DiscordCompact has a valid server id, but that server has widgets disabled!&amp;quot;);&lt;br /&gt;
            default:&lt;br /&gt;
                throw new Error(&amp;quot;DiscordCompact encountered an unknown error whilst fetching widget.json (status: &amp;quot; + req.status + &amp;quot;; code: &amp;quot; + req.responseJSON.code + &amp;quot;)&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
	}).done(function(res){&lt;br /&gt;
		const inviteURL = res.instant_invite;&lt;br /&gt;
&lt;br /&gt;
        // Warn if we can&amp;#039;t get an invite URL.&lt;br /&gt;
        if (inviteURL == null) console.warn(&amp;quot;DiscordCompact cannot get an invite URL; does this server have an invite channel set in Widget settings?&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        // Now get the widget image.&lt;br /&gt;
        $.ajax({url: apiBase + &amp;quot;/widget.png?style=banner2&amp;quot;, xhrFields: {responseType: &amp;quot;blob&amp;quot;}}).fail(function(req){&lt;br /&gt;
            if (!req.responseJSON) throw new Error(&amp;quot;DiscordCompact encountered an unknown error whilst fetching widget.png! (status: &amp;quot; + req.status);&lt;br /&gt;
            throw new Error(&amp;quot;DiscordCompact encountered an unknown error whilst fetching widget.png! (status: &amp;quot; + req.status + &amp;quot;; code: &amp;quot; + req.responseJSON.code + &amp;quot;)&amp;quot;);&lt;br /&gt;
        }).done(function(blob){&lt;br /&gt;
            // Convert the image data into base64. This prevents us having to make the client request it a second time.&lt;br /&gt;
            const imageReader = new FileReader();&lt;br /&gt;
            imageReader.readAsDataURL(blob);&lt;br /&gt;
            imageReader.onloadend = function() {&lt;br /&gt;
                const b64Data = imageReader.result;&lt;br /&gt;
&lt;br /&gt;
                // Replace the widget with an &amp;lt;a&amp;gt; tag&lt;br /&gt;
                widget.replaceWith(function() {&lt;br /&gt;
                    return $(&amp;quot;&amp;lt;a&amp;gt;&amp;quot;, {&lt;br /&gt;
                        id: widget.attr(&amp;quot;id&amp;quot;),&lt;br /&gt;
                        class: widget.attr(&amp;quot;class&amp;quot;),&lt;br /&gt;
                        style: widget.attr(&amp;quot;style&amp;quot;),&lt;br /&gt;
                        alt: &amp;quot;Discord server widget&amp;quot;,&lt;br /&gt;
                        href: inviteURL&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
                // We need to grab the widget again to update it.&lt;br /&gt;
                widget = $(&amp;quot;#discord-compact-widget&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                // Setup the CSS so that the image is displayed.&lt;br /&gt;
                widget.css(&amp;quot;display&amp;quot;, &amp;quot;block&amp;quot;);&lt;br /&gt;
                widget.css(&amp;quot;max-height&amp;quot;, &amp;quot;76px&amp;quot;);&lt;br /&gt;
                widget.css(&amp;quot;max-width&amp;quot;, &amp;quot;320px&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                // Create the image.&lt;br /&gt;
                const widgetImage = document.createElement(&amp;quot;img&amp;quot;);&lt;br /&gt;
                widgetImage.src = b64Data;&lt;br /&gt;
                widgetImage.style.width = &amp;quot;100%&amp;quot;;&lt;br /&gt;
                widgetImage.style.height = &amp;quot;100%&amp;quot;;&lt;br /&gt;
                widgetImage.style.borderRadius = &amp;quot;5px&amp;quot;;&lt;br /&gt;
                widget.append(widgetImage);&lt;br /&gt;
&lt;br /&gt;
                // Prevent image dragging.&lt;br /&gt;
                widget.on(&amp;quot;dragstart&amp;quot;, function(e) { e.preventDefault(); });&lt;br /&gt;
&lt;br /&gt;
                // We&amp;#039;re done here.&lt;br /&gt;
                console.log(&amp;quot;DiscordCompact loaded successfully!&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * based on https://dev.fandom.com/wiki/MediaWiki:DiscordIntegrator/code.js&lt;br /&gt;
 * &lt;br /&gt;
 * used by other wikis.&lt;br /&gt;
 */&lt;br /&gt;
$(function() {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
	var mconfig = mw.config.get([&lt;br /&gt;
		&amp;#039;wgContentLanguage&amp;#039;,&lt;br /&gt;
		&amp;#039;wgUserLanguage&amp;#039;,&lt;br /&gt;
		&amp;#039;wgUserName&amp;#039;&lt;br /&gt;
	]);&lt;br /&gt;
	if (window.DiscordIntegratorLoaded) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	window.DiscordIntegratorLoaded = true;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Main object&lt;br /&gt;
	 * @static&lt;br /&gt;
	 */&lt;br /&gt;
	var DiscordIntegrator = {&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * Initializing&lt;br /&gt;
		 */&lt;br /&gt;
		init: function() {&lt;br /&gt;
			mw.hook(&amp;#039;wikipage.content&amp;#039;).add($.proxy(this.insertToContent, this));&lt;br /&gt;
		},&lt;br /&gt;
		/**&lt;br /&gt;
		 * Finding the designated places in content&lt;br /&gt;
		 * in which to place the widget and placing it&lt;br /&gt;
		 */&lt;br /&gt;
		insertToContent: function($content) {&lt;br /&gt;
			$content.find(&amp;#039;.DiscordIntegrator:not(.loaded)&amp;#039;).each($.proxy(function(cabbage, el) {&lt;br /&gt;
				el = $(el);&lt;br /&gt;
				el.html(this.generateContent(el.data())).addClass(&amp;#039;loaded&amp;#039;);&lt;br /&gt;
			}, this));&lt;br /&gt;
		},&lt;br /&gt;
		/**&lt;br /&gt;
		 * Determines the theme of the widget.&lt;br /&gt;
		 * @param {string} config Configured theme&lt;br /&gt;
		 * @return {string} &amp;#039;light&amp;#039; or &amp;#039;dark&amp;#039; depending on the wiki theme and configuration&lt;br /&gt;
		 */&lt;br /&gt;
		determineTheme: function(config) {&lt;br /&gt;
			// If explicitly configured to light or dark.&lt;br /&gt;
			if (config === &amp;#039;dark&amp;#039;) {&lt;br /&gt;
				return &amp;#039;dark&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
			if (config === &amp;#039;light&amp;#039;) {&lt;br /&gt;
				return &amp;#039;light&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
			/** If not configured **/&lt;br /&gt;
			// try to determine based on wiki theme (set by themeToggle):&lt;br /&gt;
			var clas = $(&amp;#039;:root&amp;#039;).attr(&amp;#039;class&amp;#039;);&lt;br /&gt;
			var regex = /(^|\s)theme-(\w+)(\s|$)/;&lt;br /&gt;
			var match = clas.match(regex);&lt;br /&gt;
			if(match){&lt;br /&gt;
				var wikiThemeName = match[2];&lt;br /&gt;
				if(typeof(config) === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; config !== null){ //with json theme config&lt;br /&gt;
					if(config[wikiThemeName]){&lt;br /&gt;
						return config[wikiThemeName];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if(wikiThemeName === &amp;#039;light&amp;#039;){&lt;br /&gt;
					return &amp;#039;light&amp;#039;;&lt;br /&gt;
				}&lt;br /&gt;
				if(wikiThemeName === &amp;#039;dark&amp;#039;){&lt;br /&gt;
					return &amp;#039;dark&amp;#039;;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			// Otherwise, default to dark.&lt;br /&gt;
			return &amp;#039;dark&amp;#039;;&lt;br /&gt;
		},&lt;br /&gt;
		/**&lt;br /&gt;
		 * Generating widget content from an object&lt;br /&gt;
		 * @return {string} Content of the widget&lt;br /&gt;
		 */&lt;br /&gt;
		generateContent: function(config) {&lt;br /&gt;
			if (!config.id || !String(config.id).match(/\d{17,19}/)) {&lt;br /&gt;
				return &amp;quot;Error: ID of the widget is malformed or not supplied, please see &amp;lt;a href=&amp;#039;https://support.wiki.gg/wiki/DiscordWidget&amp;#039; title=&amp;#039;the instructions&amp;#039;&amp;gt;the instructions&amp;lt;/a&amp;gt; for how to find your server&amp;#039;s ID. Please make sure you are not inserting &amp;lt;strong&amp;gt;the DiscordIntegrator template&amp;lt;/strong&amp;gt; when asked for &amp;lt;strong&amp;gt;your widget ID&amp;lt;/strong&amp;gt;.&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			if (&lt;br /&gt;
				(&lt;br /&gt;
					config.loggedIn === true ||&lt;br /&gt;
					Boolean(config[&amp;#039;logged-in&amp;#039;]) === true &amp;amp;&amp;amp;&lt;br /&gt;
					config[&amp;#039;logged-in&amp;#039;] !== &amp;#039;false&amp;#039; &amp;amp;&amp;amp;&lt;br /&gt;
					config[&amp;#039;logged-in&amp;#039;] !== &amp;#039;{{{loggedIn}}}&amp;#039;&lt;br /&gt;
				) &amp;amp;&amp;amp; !mconfig.wgUserName&lt;br /&gt;
			) {&lt;br /&gt;
				return &amp;quot;Please &amp;lt;a href=&amp;#039;/Special:UserLogin&amp;#039; title=&amp;#039;log in&amp;#039;&amp;gt;log in&amp;lt;/a&amp;gt; to see this widget.&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			var username = config.username === &amp;#039;@disabled&amp;#039; ?&lt;br /&gt;
				&amp;#039;&amp;#039; :&lt;br /&gt;
				config.username === &amp;#039;@function&amp;#039; &amp;amp;&amp;amp;&lt;br /&gt;
				typeof window.DiscordIntegratorGetUsername === &amp;#039;function&amp;#039; ?&lt;br /&gt;
					window.DiscordIntegratorGetUsername() :&lt;br /&gt;
					config.username || mconfig.wgUserName;&lt;br /&gt;
			return mw.html.element(&amp;#039;iframe&amp;#039;, {&lt;br /&gt;
				src: &amp;#039;https://discord.com/widget?id=&amp;#039; + config.id +&lt;br /&gt;
					&amp;#039;&amp;amp;theme=&amp;#039; + this.determineTheme(config.theme) +&lt;br /&gt;
					&amp;#039;&amp;amp;username=&amp;#039; + encodeURIComponent(username),&lt;br /&gt;
				width: config.width || &amp;#039;100%&amp;#039;,&lt;br /&gt;
				height: config.height || &amp;#039;400px&amp;#039;,&lt;br /&gt;
				allowtransparency: &amp;#039;true&amp;#039;,&lt;br /&gt;
				frameborder: &amp;#039;0&amp;#039;,&lt;br /&gt;
				title: &amp;quot;Discord server widget&amp;quot;&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	DiscordIntegrator.init();&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>imported&gt;Merge</name></author>
	</entry>
</feed>