(function () {
// 1) Basic bot filter (extend if you like)
function isBot() {
return /(bot|crawl|spider|google|bing|slurp|yandex|facebook|linkedin|pinterest|preview|whatsapp|discord|telegram|headless|puppeteer)/i
.test(navigator.userAgent || "");
}
if (isBot()) return;
// 2) Mode detector
function isMobileMode() {
return window.matchMedia("(max-width: 767px)").matches ||
/Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent || "");
}
// 3) Your ad configs (swap keys/sizes to match your network units)
const AD = {
mobile: { key: "aa6d52a6037d0558c2a19dc52b6aa824", width: 320, height: 50 }, // 320x50
desktop: { key: "a49752dcde88f4fde5987d25efbb7168", width: 468, height: 60 } // 468x60
};
// 4) Create container if it doesn't exist
function ensureContainer() {
let container = document.getElementById("ad-container");
if (!container) {
container = document.createElement("div");
container.id = "ad-container";
container.style.display = "none";
document.body.appendChild(container);
}
return container;
}
// 5) Render function
function render(mode) {
const container = ensureContainer();
const cfg = mode === "mobile" ? AD.mobile : AD.desktop;
// Set global atOptions for ad network
window.atOptions = {
key: cfg.key,
format: "iframe",
height: cfg.height,
width: cfg.width,
params: {}
};
// Clear previous ad/script then inject
container.innerHTML = "";
container.style.display = "block";
const s = document.createElement("script");
s.src = `//selfportraitproved.com/${cfg.key}/invoke.js`;
s.async = true;
container.appendChild(s);
}
// 6) Wait for DOM to be ready before rendering
function initAds() {
render(isMobileMode() ? "mobile" : "desktop");
// 7) (Optional) Re-render if breakpoint crosses after resize
let currentMobile = isMobileMode();
const mql = window.matchMedia("(max-width: 767px)");
if (mql.addEventListener) {
mql.addEventListener("change", (e) => {
const nowMobile = e.matches;
if (nowMobile !== currentMobile) {
currentMobile = nowMobile;
render(currentMobile ? "mobile" : "desktop");
}
});
} else if (mql.addListener) { // older browsers
mql.addListener((e) => {
const nowMobile = e.matches;
if (nowMobile !== currentMobile) {
currentMobile = nowMobile;
render(currentMobile ? "mobile" : "desktop");
}
});
}
}
// 8) Execute when DOM is ready
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initAds);
} else {
initAds();
}
})();
XQc was given a surprise yesterday on stream while playing the horror-themed puzzle title Welcome to The Game when random music started to play and he wasn’t sure where it was coming from.
Confused by the situation, xQc looked at his chat, which was quick to tell him that the game’s developer was messing around with him by playing the Dr. Disrespect “Gillette” song.
The developer is apparently known for streaming from and messing around with players.
After a while, xQc caught on to how the developer was hacking into his game. He went to an in-game computer and found that YouTube had been pulled up with songs playing from there.
👉 For more insights, check out this resource.
Along with playing “Gillette” and a Gachi rave remix song, the developer further toyed with xQc by sending him a message while he was at the game’s computer telling him that his chat would decide what he was exposed to.
“The chat now decides your fate,” the developer wrote in a note to xQc on the in-game computer. “If your chat spams 777, I will release the doll.”
👉 Discover more in this in-depth guide.
Naturally, his chat immediately began spamming the number, and the developer later made xQc face off against the “Dollmaster.”
Additionally, the developer played some more random music for the former Overwatch pro, including numerous Twitch meme related songs.
The back and forth between xQc and Welcome to The Game’s developer led to an average of 29,005 viewers for xQc during his hour of playtime on stream yesterday. In addition, he peaked at just over 30,120 viewers for the play session, according to Twitch statistics website SullyGnome.