您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Show chat on game page
// ==UserScript== // @name AWBW game chat // @namespace http://tampermonkey.net/ // @version 0.0.0.0.0.0.5 // @description Show chat on game page // @author new1234 // @match https://awbw.amarriner.com/game.php?games_id=* // @icon https://awbw.amarriner.com/terrain/messages.gif // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; const userName = document.querySelector('h2.green-bold a').textContent.trim(); const chatUrl = window.location.href.replace('game.php', 'press.php'); let chatContainer, toggleButton, badge, sendMessageContainer; let isChatHidden = false; let unreadCount = 0; let currentCount = 0; let isYourChat = true; const gifMap = { ":SaluteGirl_YC_Inf:": "https://cdn.discordapp.com/emojis/1100180778232578088.png?size=96", ":happy_sasha:": "https://cdn.discordapp.com/emojis/385660054595960833.png?size=96", ":Grimm_Sweats:": "https://cdn.discordapp.com/emojis/1059238674597957642.png?size=240", ":Pog:": "https://cdn.discordapp.com/emojis/949888810580312075.png?size=240", ":NellWarCrimes:": "https://cdn.discordapp.com/emojis/911692037160579164.png?size=96", ":DogKek:": "https://cdn.discordapp.com/emojis/1032019469733736538.png?size=100", ":GrinGrimm:": "https://cdn.discordapp.com/emojis/769071175585890304.png?size=100", ":Nooo_Whyyy:": "https://cdn.discordapp.com/emojis/1007135137391194223.png?size=100", ":GS_Inf:": "https://cdn.discordapp.com/emojis/1397768999705641001.png?size=100", ":MiniJugger:": "https://cdn.discordapp.com/emojis/1392115444873171037.png?size=100", ":MonkeMax:": "https://cdn.discordapp.com/emojis/953465265000165376.png?size=100", ":Jugger_HeadPat:": "https://cdn.discordapp.com/emojis/1189392736525242378.png?size=100", ":Floppus:": "https://cdn.discordapp.com/emojis/1297782242545893428.png?size=100", ":senile_vonbolt:": "https://cdn.discordapp.com/emojis/385661550159200267.png?size=100", ":AndyNod:": "https://cdn.discordapp.com/emojis/1297367887937540147.png?size=100", ":FlakGrin:": "https://cdn.discordapp.com/emojis/1022689428071796776.png?size=100", ":Kindle_WineAboutIt:": "https://cdn.discordapp.com/emojis/1184154519383330879.png?size=100", ":OozeCruise:": "https://cdn.discordapp.com/emojis/933381036740583434.png?size=100", ":ConfusedAndy:": "https://cdn.discordapp.com/emojis/930990061170855948.png?size=100", ":SadEagle:": "https://cdn.discordapp.com/emojis/981903868826890320.png?size=100", ":Sonja_Nooooo:": "https://cdn.discordapp.com/emojis/1175605077042536498.png?size=100", ":fog~1:": "https://cdn.discordapp.com/emojis/890402734459715644.png?size=100", ":Sonja_Calculated:": "https://cdn.discordapp.com/emojis/1268651886064435232.png?size=100", ":Ohohoho_Kindle:": "https://cdn.discordapp.com/emojis/1082517278161109042.png?size=100", ":OlafGrin:": "https://cdn.discordapp.com/emojis/934192279520956426.png?size=100", ":MD_Classy:": "https://cdn.discordapp.com/emojis/917134216611889153.png?size=100", ":Troll_Koal:": "https://cdn.discordapp.com/emojis/993268371657343057.png?size=100", ":StealthSan:": "https://cdn.discordapp.com/emojis/745713642938433626.png?size=100", ":WiseSensei:": "https://cdn.discordapp.com/emojis/943834512847175700.png?size=100", ":BattleShipping:": "https://cdn.discordapp.com/emojis/932509911366119434.png?size=100", ":MarketCrash_Sasha:": "https://cdn.discordapp.com/emojis/1281046429158080556.png?size=100", ":NoSurvivors_Rachel:": "https://cdn.discordapp.com/emojis/1030552250831097886.png?size=100", ":NervousColin:": "https://cdn.discordapp.com/emojis/1306819591418413066.png?size=100", ":AAirTrafficControl:": "https://cdn.discordapp.com/emojis/1315865700509941770.png?size=100", ":AndyAirport:": "https://cdn.discordapp.com/emojis/1169087384072224888.png?size=100", ":Sami_Whaet:": "https://cdn.discordapp.com/emojis/1227733541853462538.png?size=100", ":BombVoyage:": "https://cdn.discordapp.com/emojis/933457083548979290.png?size=100", ":MEGATANK:": "https://cdn.discordapp.com/emojis/869741733540413461.png?size=100", ":CopterSac:": "https://cdn.discordapp.com/emojis/1315869235989188701.png?size=100", ":CarryMe:": "https://cdn.discordapp.com/emojis/915590613284585524.png?size=100", ":Hawke_Yeah:": "https://cdn.discordapp.com/emojis/932503724348276846.png?size=100", ":Cool_Eagle:": "https://cdn.discordapp.com/emojis/1139598736448815256.png?size=100", ":SenPipe:": "https://cdn.discordapp.com/emojis/865314376700919808.png?size=100", ":APC_APerfectBait:": "https://cdn.discordapp.com/emojis/917131066874134538.png?size=100", ":Adderenaline:": "https://cdn.discordapp.com/emojis/1098364166009540699.png?size=100", ":AmberLander:": "https://cdn.discordapp.com/emojis/933194211812069436.png?size=100", ":AndyGrin:": "https://cdn.discordapp.com/emojis/953357652702933002.png?size=100", ":AngryKanbei:": "https://cdn.discordapp.com/emojis/1175995777496121384.png?size=100", ":AngryKitteh:": "https://cdn.discordapp.com/emojis/1008717391011774484.png?size=100", ":Angry_Flak:": "https://cdn.discordapp.com/emojis/325404480676036608.png?size=100", ":Angry_Sonja:": "https://cdn.discordapp.com/emojis/325608078877655040.png?size=100", ":Annoyed_Sasha:": "https://cdn.discordapp.com/emojis/1131367288180850749.png?size=100", ":ArtyParty:": "https://cdn.discordapp.com/emojis/908538470186758256.png?size=100", ":Aww_Lash:": "https://cdn.discordapp.com/emojis/1067659762709315674.png?size=100", ":BadLuck_Sonja:": "https://cdn.discordapp.com/emojis/1098361538764623902.png?size=100", ":BannedBomb:": "https://cdn.discordapp.com/emojis/1315863409333637183.png?size=100", ":BigBrain:": "https://cdn.discordapp.com/emojis/932227159391629312.png?size=100", ":BlackCatRachel:": "https://cdn.discordapp.com/emojis/1355005110224158950.png?size=100", ":BlankStareHawke:": "https://cdn.discordapp.com/emojis/1025812223815331901.png?size=100", ":Blep_Sami:": "https://cdn.discordapp.com/emojis/1098376825111064756.png?size=100", ":BoomBaboon:": "https://cdn.discordapp.com/emojis/1390390697646886993.png?size=100", ":BootyHunterDrake:": "https://cdn.discordapp.com/emojis/433573167697625091.png?size=100", ":BrainHurt_CloneAndy:": "https://cdn.discordapp.com/emojis/1099180968876707981.png?size=100", ":BullyMax:": "https://cdn.discordapp.com/emojis/1048472053168222248.png?size=100", ":COpower:": "https://cdn.discordapp.com/emojis/852953743343616060.png?size=100", ":CatinHat:": "https://cdn.discordapp.com/emojis/932472401768374363.png?size=100", ":Chad_Kanbei:": "https://cdn.discordapp.com/emojis/1384904027610939552.png?size=100", ":Cheers_Sasha:": "https://cdn.discordapp.com/emojis/1009887757553901578.png?size=100", ":Clever_Girl:": "https://cdn.discordapp.com/emojis/1299445598340251688.png?size=100", ":Cringe_Kanbei:": "https://cdn.discordapp.com/emojis/325574195943702528.png?size=100", ":Cruisin4ABruisin:": "https://cdn.discordapp.com/emojis/933192292578242570.png?size=100", ":Cry_OS_inf:": "https://cdn.discordapp.com/emojis/520585397638529044.png?size=100", ":D2D_DaytoDay:": "https://cdn.discordapp.com/emojis/1131387035479965817.png?size=100", ":Devious_Lash:": "https://cdn.discordapp.com/emojis/1098739264264609883.png?size=100", ":Disappointed_Kindle:": "https://cdn.discordapp.com/emojis/580551903943852032.png?size=100", ":Do_it_Adder:": "https://cdn.discordapp.com/emojis/1029390076381233182.png?size=100", ":DoginHat:": "https://cdn.discordapp.com/emojis/1008017533074427944.png?size=100", ":DrakeAbouttoBlow:": "https://cdn.discordapp.com/emojis/956475191742054410.png?size=100", ":Drake_Eeeh:": "https://cdn.discordapp.com/emojis/1131336797226541248.png?size=100", ":Drake_ShiverMeTimbers:": "https://cdn.discordapp.com/emojis/1273401571702739007.png?size=100", ":EagleAngry:": "https://cdn.discordapp.com/emojis/857802039312646155.png?size=100", ":EagleFlyHigh:": "https://cdn.discordapp.com/emojis/855167497791864852.png?size=100", ":ElJavier:": "https://cdn.discordapp.com/emojis/1022633536206950461.png?size=100", ":EvilCloneAndy:": "https://cdn.discordapp.com/emojis/1103134365552234546.png?size=100", ":Excited_Lash:": "https://cdn.discordapp.com/emojis/1098637016553492641.png?size=100", ":FacepalmSonja:": "https://cdn.discordapp.com/emojis/915041256810364958.png?size=100", ":Fail_Sturm:": "https://cdn.discordapp.com/emojis/1104587436488675388.png?size=100", ":Fascinating_Caulder:": "https://cdn.discordapp.com/emojis/460280745035038720.png?size=100", ":FightOrFlight:": "https://cdn.discordapp.com/emojis/1315866880694685747.png?size=100", ":FlakBonk:": "https://cdn.discordapp.com/emojis/1317222890071920740.png?size=100", ":FlakSmirk:": "https://cdn.discordapp.com/emojis/933944985450082304.png?size=100", ":FlexRunner:": "https://cdn.discordapp.com/emojis/1008379362611048478.png?size=100", ":FreeCity:": "https://cdn.discordapp.com/emojis/932352916856111255.png?size=100", ":FreeDude:": "https://cdn.discordapp.com/emojis/1009273947524710480.png?size=100", ":Gasp:": "https://cdn.discordapp.com/emojis/1009214358200516618.png?size=100", ":Gladder:": "https://cdn.discordapp.com/emojis/597561297479139338.png?size=100", ":GodMode_Grimm:": "https://cdn.discordapp.com/emojis/1189752762288853093.png?size=100", ":GreedyLash:": "https://cdn.discordapp.com/emojis/983457607597559908.png?size=100", ":GrimmReaper:": "https://cdn.discordapp.com/emojis/1291349320037044306.png?size=100", ":Grimmstinct:": "https://cdn.discordapp.com/emojis/808221982537678849.png?size=100", ":GrinKanbei:": "https://cdn.discordapp.com/emojis/1029249533470842900.png?size=100", ":Grit_Gun:": "https://cdn.discordapp.com/emojis/1037166830772555806.png?size=100", ":Grit_Hehehe:": "https://cdn.discordapp.com/emojis/1097338578960388136.png?size=100", ":Gun_Lin:": "https://cdn.discordapp.com/emojis/1016171259836502117.png?size=100", ":Gwarharhar_Beast:": "https://cdn.discordapp.com/emojis/642509360148250663.png?size=100", ":HangThem_Greyfield:": "https://cdn.discordapp.com/emojis/795729757803118622.png?size=100", ":HappyEagle:": "https://cdn.discordapp.com/emojis/1168759142081630310.png?size=100", ":HappyGirl_OS_Inf:": "https://cdn.discordapp.com/emojis/1100193863299244142.png?size=100", ":HappyKoal:": "https://cdn.discordapp.com/emojis/937232507915604029.png?size=100", ":Happy_Jess:": "https://cdn.discordapp.com/emojis/950189055788859442.png?size=100", ":Happy_Lash:": "https://cdn.discordapp.com/emojis/325608122238500865.png?size=100", ":Happy_Olaf:": "https://cdn.discordapp.com/emojis/1095064011512487967.png?size=100", ":Happy_Sami:": "https://cdn.discordapp.com/emojis/325404805440995350.png?size=100", ":Happy_Sonja:": "https://cdn.discordapp.com/emojis/1103121003648929862.png?size=100", ":Happy_Sturm:": "https://cdn.discordapp.com/emojis/1374575761264083085.png?size=100", ":Hawke_Approves:": "https://cdn.discordapp.com/emojis/1100525155052179528.png?size=100", ":Hawke_DeepBreath:": "https://cdn.discordapp.com/emojis/1102757683595071509.png?size=100", ":Hawke_Disapproves:": "https://cdn.discordapp.com/emojis/1101011360340529222.png?size=100", ":Hawkeward:": "https://cdn.discordapp.com/emojis/938105930334220289.png?size=100", ":High_Society_Kindle:": "https://cdn.discordapp.com/emojis/1269832087423160405.png?size=100", ":Hopium_VonBolt:": "https://cdn.discordapp.com/emojis/1042655906070003722.png?size=100", ":ImWatchingYou:": "https://cdn.discordapp.com/emojis/1278769529354190869.png?size=100", ":Interested_Jess:": "https://cdn.discordapp.com/emojis/1100099182389362739.png?size=100", ":JakeTheMan:": "https://cdn.discordapp.com/emojis/1076907050564591726.png?size=100", ":Javier0Towers:": "https://cdn.discordapp.com/emojis/869374111468617788.png?size=100", ":Javier1Tower:": "https://cdn.discordapp.com/emojis/1374148379680182394.png?size=100", ":Javier2Towers:": "https://cdn.discordapp.com/emojis/674075939784622080.png?size=100", ":Javier3Towers:": "https://cdn.discordapp.com/emojis/1268363337612394567.png?size=100", ":Jesster:": "https://cdn.discordapp.com/emojis/1056281730547449908.png?size=100", ":JuggerUhoh:": "https://cdn.discordapp.com/emojis/936662947663605861.png?size=100", ":Juggerright:": "https://cdn.discordapp.com/emojis/899527673141927986.png?size=100", ":KindleBlush:": "https://cdn.discordapp.com/emojis/960147961847898142.png?size=100", ":Kindle_Hair:": "https://cdn.discordapp.com/emojis/1131331922736455842.png?size=100", ":KoalMiner:": "https://cdn.discordapp.com/emojis/938641561409970186.png?size=100", ":LFG_LetsFlakingGo:": "https://cdn.discordapp.com/emojis/941142242360451164.png?size=100", ":LOL_Drake:": "https://cdn.discordapp.com/emojis/1103125007024013352.png?size=100", ":Lash_Out:": "https://cdn.discordapp.com/emojis/1098634081161449664.png?size=100", ":Laugh_Sensei:": "https://cdn.discordapp.com/emojis/1098373273869361233.png?size=100", ":LeChadder:": "https://cdn.discordapp.com/emojis/945043389710221342.png?size=100", ":LowRoll_Flak:": "https://cdn.discordapp.com/emojis/1098352957847765103.png?size=100", ":LumpOfKoal:": "https://cdn.discordapp.com/emojis/1314973531544748072.png?size=100", ":MadBeatsJake:": "https://cdn.discordapp.com/emojis/936685325386924062.png?size=100", ":Madder:": "https://cdn.discordapp.com/emojis/1099539231493337118.png?size=100", ":MaxPain:": "https://cdn.discordapp.com/emojis/941216734235467797.png?size=100", ":MaxStronk:": "https://cdn.discordapp.com/emojis/855159792536256569.png?size=100", ":MissileChan:": "https://cdn.discordapp.com/emojis/760196804540498011.png?size=100", ":Monke:": "https://cdn.discordapp.com/emojis/1390390281999880333.png?size=100", ":Mwahaha_Sturm:": "https://cdn.discordapp.com/emojis/1328806036999507978.png?size=100", ":NellLuckyStar:": "https://cdn.discordapp.com/emojis/1040313833757093990.png?size=100", ":Nell_glhf:": "https://cdn.discordapp.com/emojis/643778713636438027.png?size=100", ":NellDoro_SlotMachine:": "https://cdn.discordapp.com/emojis/1399059185718526012.gif?size=100", ":NellDoro:": "https://cdn.discordapp.com/emojis/1375223936261951599.png?size=240", ":NellInfinite:": "https://media1.tenor.com/m/MFu7yHgp4k8AAAAd/awbw-nelldoro.gif", ":NellDoro_Headpat:": "https://media.discordapp.net/stickers/1389956651255205930.webp?size=320&quality=lossless", ":NellDoro_Gray:": "https://cdn.discordapp.com/emojis/1384648714773205124.webp?size=240", ":NoMoney_Colin:": "https://cdn.discordapp.com/emojis/1102759826720817172.png?size=100", ":OOF:": "https://cdn.discordapp.com/emojis/705067072534872115.png?size=100", ":OlafConfused:": "https://cdn.discordapp.com/emojis/857799789445906453.png?size=100", ":Olaf_Tears:": "https://cdn.discordapp.com/emojis/1277770151894454316.png?size=100", ":Oof_Hachi:": "https://cdn.discordapp.com/emojis/1102761279510290492.png?size=100", ":Pain_Kanbei:": "https://cdn.discordapp.com/emojis/1093348753630576640.png?size=100", ":PossumSpitGrit:": "https://cdn.discordapp.com/emojis/1028180500973629460.png?size=100", ":Pouty_Lash:": "https://cdn.discordapp.com/emojis/1094116252118679592.png?size=100", ":PowerofMoney:": "https://cdn.discordapp.com/emojis/937565112015921272.png?size=100", ":Press_MaX_to_Doubt:": "https://cdn.discordapp.com/emojis/1098391064018161694.png?size=100", ":Proud_Colin:": "https://cdn.discordapp.com/emojis/1100493494411341917.png?size=100", ":RachelWink:": "https://cdn.discordapp.com/emojis/934127886674325564.png?size=100", ":Rachel_Thonk:": "https://cdn.discordapp.com/emojis/1186522275047022592.png?size=100", ":Rage_Sami:": "https://cdn.discordapp.com/emojis/1094767475373125662.png?size=100", ":RaisedEyebrow_Kanbei:": "https://cdn.discordapp.com/emojis/1034151124128768150.png?size=100", ":Really_BM:": "https://cdn.discordapp.com/emojis/933941281950949396.png?size=100", ":RichHachi:": "https://cdn.discordapp.com/emojis/937565012933890108.png?size=100", ":RocketNLoad:": "https://cdn.discordapp.com/emojis/917134818154803231.png?size=100", ":Roger_Colin:": "https://cdn.discordapp.com/emojis/325573948378972160.png?size=100", ":SCOpower:": "https://cdn.discordapp.com/emojis/852953758857953342.png?size=100", ":SadGE_inf:": "https://cdn.discordapp.com/emojis/520585397764620308.png?size=100", ":Sad_Grit:": "https://cdn.discordapp.com/emojis/325419692472926208.png?size=100", ":Sadder:": "https://cdn.discordapp.com/emojis/325607727881519106.png?size=100", ":SaluteGirl_YC_Inf:": "https://cdn.discordapp.com/emojis/1100180778232578088.png?size=100", ":SamiSwitch:": "https://cdn.discordapp.com/emojis/854874491393802241.png?size=100", ":Sami_Smile:": "https://cdn.discordapp.com/emojis/1056341596297244722.png?size=100", ":SantaOlaf:": "https://cdn.discordapp.com/emojis/1314973110281175101.png?size=100", ":SashaOMG:": "https://cdn.discordapp.com/emojis/1296982034505400380.png?size=100", ":SashaSmile:": "https://cdn.discordapp.com/emojis/950706588199559168.png?size=100", ":ScaredColin:": "https://cdn.discordapp.com/emojis/1282517125663162400.png?size=100", ":Scared_BH:": "https://cdn.discordapp.com/emojis/933202199536869486.png?size=100", ":SeriousColin:": "https://cdn.discordapp.com/emojis/942781164580655184.png?size=100", ":Shakefist_Andy:": "https://cdn.discordapp.com/emojis/1019082158771535932.png?size=100", ":ShoalPool:": "https://cdn.discordapp.com/emojis/911390709351858237.png?size=100", ":ShockedGrimm:": "https://cdn.discordapp.com/emojis/943705832766468208.png?size=100", ":Shrug_Hachi:": "https://cdn.discordapp.com/emojis/1045733595542724648.png?size=100", ":Smirk_Sensei:": "https://cdn.discordapp.com/emojis/325419741927964672.png?size=100", ":SmugColin:": "https://cdn.discordapp.com/emojis/940229355454476299.png?size=100", ":SmugEagle:": "https://cdn.discordapp.com/emojis/325608337305632768.png?size=100", ":SomberSalute_Sami:": "https://cdn.discordapp.com/emojis/580552533903409161.png?size=100", ":SonjaShades:": "https://cdn.discordapp.com/emojis/911393322919153734.png?size=100", ":Sonja_Shocked:": "https://cdn.discordapp.com/emojis/1371636998548226199.png?size=100", ":SpannIsland:": "https://cdn.discordapp.com/emojis/999072845940392058.png?size=100", ":Squak_CI_inf:": "https://cdn.discordapp.com/emojis/745706900015939594.png?size=100", ":StoicJess:": "https://cdn.discordapp.com/emojis/942096546919497778.png?size=100", ":SturmFist:": "https://cdn.discordapp.com/emojis/953823553424326706.png?size=100", ":SturmOut:": "https://cdn.discordapp.com/emojis/1305698974077816872.png?size=100", ":SubOptimal:": "https://cdn.discordapp.com/emojis/1315874019701952553.png?size=100", ":SurfinDrake:": "https://cdn.discordapp.com/emojis/1220523488889143336.png?size=100", ":Surprised_Jess:": "https://cdn.discordapp.com/emojis/1100597961160925254.png?size=100", ":Surprised_Lash:": "https://cdn.discordapp.com/emojis/966625937229758514.png?size=100", ":Sus_Impostor:": "https://cdn.discordapp.com/emojis/1001118787841572914.png?size=100", ":TCopRide:": "https://cdn.discordapp.com/emojis/915452885398085693.png?size=100", ":ThankTank:": "https://cdn.discordapp.com/emojis/760196782940225577.png?size=100", ":This_Andy:": "https://cdn.discordapp.com/emojis/1025367337962065971.png?size=100", ":TriggeredEagle:": "https://cdn.discordapp.com/emojis/1021264019962732626.png?size=100", ":True_Hawke:": "https://cdn.discordapp.com/emojis/1273399235139862591.png?size=100", ":TurboCharged_Jess:": "https://cdn.discordapp.com/emojis/1099184260780404849.png?size=100", ":UnitCap_Sensei:": "https://cdn.discordapp.com/emojis/1042575856880590978.png?size=100", ":Vibing_GS:": "https://cdn.discordapp.com/emojis/933940003984277554.png?size=100", ":VictoryMarch:": "https://cdn.discordapp.com/emojis/1024433528236146810.png?size=100", ":VonBowl:": "https://cdn.discordapp.com/emojis/940690530449383454.png?size=100", ":VonBulb:": "https://cdn.discordapp.com/emojis/1066546447237001306.png?size=100", ":WN_MechSpam:": "https://cdn.discordapp.com/emojis/1315872277056716860.png?size=100", ":What_YC:": "https://cdn.discordapp.com/emojis/933422136872304760.png?size=100", ":Wingman_Waylon:": "https://cdn.discordapp.com/emojis/888142369172627517.png?size=100", ":Wink_Kindle:": "https://cdn.discordapp.com/emojis/385654699279253505.png?size=100", ":Wisecrack_Grit:": "https://cdn.discordapp.com/emojis/1098381464577515653.png?size=100", ":WorriedHachi:": "https://cdn.discordapp.com/emojis/937235358704365608.png?size=100", ":Worried_Drake:": "https://cdn.discordapp.com/emojis/325574058953670658.png?size=100", ":YeahSure_Jake:": "https://cdn.discordapp.com/emojis/1126968024453361725.png?size=100", ":YouWot_Grit:": "https://cdn.discordapp.com/emojis/933405408205361222.png?size=100", ":Zombie_Sensei:": "https://cdn.discordapp.com/emojis/1223127068175372328.png?size=100", ":angry_koal:": "https://cdn.discordapp.com/emojis/385649720485478410.png?size=100", ":annoyed_rachel:": "https://cdn.discordapp.com/emojis/385660982044786688.png?size=100", ":any:": "https://cdn.discordapp.com/emojis/890403723342405652.png?size=100", ":bitter_nell:": "https://cdn.discordapp.com/emojis/585983754724573205.png?size=100", ":bmbboat:": "https://cdn.discordapp.com/emojis/870920521544519720.png?size=100", ":drakenshake:": "https://cdn.discordapp.com/emojis/854459929946226738.png?size=100", ":embarrassed_jess:": "https://cdn.discordapp.com/emojis/325608309887598592.png?size=100", ":gasp_nell:": "https://cdn.discordapp.com/emojis/585986549917941770.png?size=100", ":happy_hachi:": "https://cdn.discordapp.com/emojis/325608462908129280.png?size=100", ":happy_max:": "https://cdn.discordapp.com/emojis/385656510698618890.png?size=100", ":happy_nell:": "https://cdn.discordapp.com/emojis/934815103730192444.png?size=100", ":hasnofeelings_sturm:": "https://cdn.discordapp.com/emojis/325947988188987392.png?size=100", ":hf:": "https://cdn.discordapp.com/emojis/890404234112159764.png?size=100", ":hmm_olaf:": "https://cdn.discordapp.com/emojis/325607810476015616.png?size=100", ":osbboat:": "https://cdn.discordapp.com/emojis/870805502802669588.png?size=100", ":shocked_sami:": "https://cdn.discordapp.com/emojis/325608265448816643.png?size=100", ":shook_kanbei:": "https://cdn.discordapp.com/emojis/557425447651246081.png?size=100", ":std:": "https://cdn.discordapp.com/emojis/890403004614860830.png?size=100", ":stern_hawke:": "https://cdn.discordapp.com/emojis/580551903809634325.png?size=100", ":stoic_javier:": "https://cdn.discordapp.com/emojis/385659523181969409.png?size=100", ":sturmkart:": "https://cdn.discordapp.com/emojis/859258795968299079.png?size=100", ":surprisekiss_sturm:": "https://cdn.discordapp.com/emojis/326351964336291841.png?size=100", ":thinking_lin:": "https://cdn.discordapp.com/emojis/877392297170440275.png?size=100", ":thistbh:": "https://cdn.discordapp.com/emojis/1044824685663244318.png?size=100", ":unimpressed_jake:": "https://cdn.discordapp.com/emojis/385658779464892418.png?size=100", ":working_bot:": "https://cdn.discordapp.com/emojis/580551904183189514.png?size=100", ":BigMonke:": "https://cdn.discordapp.com/emojis/1382114663961071656.webp?size=60&animated=true", ":BooHoo_Sturm:": "https://cdn.discordapp.com/emojis/1382114851425357894.gif?size=100", ":Boom_Explosion:": "https://cdn.discordapp.com/emojis/1382114518058143875.webp?size=60&animated=true", ":Caesar_Happy:": "https://cdn.discordapp.com/emojis/579454151696842752.gif?size=100", ":DoomPengus:": "https://cdn.discordapp.com/emojis/865011667002589224.gif?size=100", ":Flag10_JS:": "https://cdn.discordapp.com/emojis/1223129529011277885.gif?size=100", ":Flag11_CI:": "https://cdn.discordapp.com/emojis/1223129545893351476.gif?size=100", ":Flag12_PC:": "https://cdn.discordapp.com/emojis/1223129555418480650.gif?size=100", ":Flag13_TG:": "https://cdn.discordapp.com/emojis/1223130004247019520.gif?size=100", ":Flag14_PL:": "https://cdn.discordapp.com/emojis/1223130023305805856.gif?size=100", ":Flag15_AR:": "https://cdn.discordapp.com/emojis/1223130036954075136.gif?size=100", ":Flag16_WN:": "https://cdn.discordapp.com/emojis/1223130050006876191.gif?size=100", ":Flag17_AA:": "https://cdn.discordapp.com/emojis/1234057073151442954.gif?size=100", ":Flag18_NE:": "https://cdn.discordapp.com/emojis/1304083510247690293.gif?size=100", ":Flag19_SC:": "https://cdn.discordapp.com/emojis/1304083538555043861.gif?size=100", ":Flag1_OS:": "https://cdn.discordapp.com/emojis/1223128030004772954.gif?size=100", ":Flag20_UW:": "https://cdn.discordapp.com/emojis/1382114010635309056.gif?size=100", ":Flag2_BM:": "https://cdn.discordapp.com/emojis/1223128274243420180.gif?size=100", ":Flag3_GE:": "https://cdn.discordapp.com/emojis/1223128607535267892.gif?size=100", ":Flag4_YC:": "https://cdn.discordapp.com/emojis/1223128618536927242.gif?size=100", ":Flag5_BH:": "https://cdn.discordapp.com/emojis/1223128631056928959.gif?size=100", ":Flag6_RF:": "https://cdn.discordapp.com/emojis/1223129097321054229.gif?size=100", ":Flag7_GS:": "https://cdn.discordapp.com/emojis/1223129109258043423.gif?size=100", ":Flag8_BD:": "https://cdn.discordapp.com/emojis/1223129124013473833.gif?size=100", ":Flag9_AB:": "https://cdn.discordapp.com/emojis/1223129159153225729.gif?size=100", ":G_Signal:": "https://cdn.discordapp.com/emojis/1382114292136017950.gif?size=100", ":GooMechGo:": "https://cdn.discordapp.com/emojis/1382114224658186290.gif?size=100", ":GrimmIntensifies:": "https://cdn.discordapp.com/emojis/674075940019634195.gif?size=100", ":Grimmier:": "https://cdn.discordapp.com/emojis/869723639539466261.gif?size=100", ":Grin_Eagle:": "https://cdn.discordapp.com/emojis/1100945089154527304.gif?size=100", ":ILaughAtYouNow_Sturm:": "https://cdn.discordapp.com/emojis/1382114793581969580.gif?size=100", ":Kanbei_happy:": "https://cdn.discordapp.com/emojis/579458525307338755.gif?size=100", ":MechaDino:": "https://cdn.discordapp.com/emojis/1382114329020858582.gif?size=100", ":Nooo:": "https://cdn.discordapp.com/emojis/1382114267989545043.gif?size=100", ":Sandy:": "https://cdn.discordapp.com/emojis/579458525437231104.gif?size=100", ":Sneaky:": "https://cdn.discordapp.com/emojis/864966048193052713.gif?size=100", ":SturmKartSelect:": "https://cdn.discordapp.com/emojis/1382114196187254945.gif?size=100", ":WGSami:": "https://cdn.discordapp.com/emojis/632433510539329537.gif?size=100", ":drake_booty:": "https://cdn.discordapp.com/emojis/579458525101686806.gif?size=100", ":good_rng:": "https://cdn.discordapp.com/emojis/579458525600677906.gif?size=100", ":grit_smug:": "https://cdn.discordapp.com/emojis/579458525596483588.gif?size=100", ":max_blast:": "https://cdn.discordapp.com/emojis/579458525441294347.gif?size=100", ":olaf_smirk:": "https://cdn.discordapp.com/emojis/579458525135110175.gif?size=100", ":sad_olaf:": "https://cdn.discordapp.com/emojis/579458526842454026.gif?size=100", ":sami_victory:": "https://cdn.discordapp.com/emojis/579458525151887371.gif?size=100", ":santa_sad:": "https://cdn.discordapp.com/emojis/579458525474848768.gif?size=100", ":smoke_sturm:": "https://cdn.discordapp.com/emojis/536186609217961984.gif?size=100", ":soaring_eagle:": "https://cdn.discordapp.com/emojis/579458525214932994.gif?size=100", ":sonja_smile:": "https://cdn.discordapp.com/emojis/579458525617455104.gif?size=100", ":sticker_Sticker,_⭐_Olaf's_Fury,_:": "https://media.discordapp.net/stickers/1402255046422433824.png?size=240", ":sticker_Sticker,_Hmm,_Nice_HQ!,_Be_a_shame_if_something_happened_to_it!:": "https://media.discordapp.net/stickers/1072737826283716669.png?size=240", ":sticker_Sticker,_Oh_No!,_Oh_no,_my_tank!:": "https://media.discordapp.net/stickers/915041125251821619.png?size=240", ":sticker_Sticker,_Kindle_Super,_High_Societyyyy!_:": "https://media.discordapp.net/stickers/911392402772733983.png?size=240", ":sticker_Sticker,_Olaf_Send_Link,_:": "https://media.discordapp.net/stickers/1268545405214265445.gif?size=320", ":sticker_Sticker,_⭐_Jugger_Prime_,_:": "https://media.discordapp.net/stickers/1401285808891105362.gif?size=320", ":sticker_Sticker,_Missile-Chan_Dance,_Permission_received_from_artist:_https://twitter.com/NCHproductions:": "https://media.discordapp.net/stickers/1157254342269743114.png?size=320", ":sticker_Sticker,_Chadder,_:": "https://media.discordapp.net/stickers/899862255200526346.png?size=240", ":sticker_Sticker,_Strut_Kanbei,_They_see_me_walking,_they_hatin!:": "https://media.discordapp.net/stickers/1021960280810467438.png?size=240", ":sticker_Sticker,_Power_of_Tower,_:": "https://media.discordapp.net/stickers/930990803596226611.png?size=240", ":sticker_Sticker,_The_\"Hawke\"_Johnson,_:": "https://media.discordapp.net/stickers/1189331240759869582.png?size=240", ":sticker_Sticker,_Sitting_on_Cities_,_Young_whippersnappers_:": "https://media.discordapp.net/stickers/933040279118827562.png?size=240", ":sticker_Sticker,_Hachi_Stronks_Up,_Market_Crash:": "https://media.discordapp.net/stickers/1024730056414724207.png?size=320", ":sticker_Sticker,_Sturm_Warning,_Scattered_showers_and_a_chance_of_DEATH!!!:": "https://media.discordapp.net/stickers/1024514184744013884.png?size=320", ":sticker_Sticker,_Eagle_Grin,_Eagle_Grin:": "https://media.discordapp.net/stickers/865316024214749236.png?size=320", ":sticker_Sticker,_Yeah_Boi_Jake,_:": "https://media.discordapp.net/stickers/932680719547916288.png?size=240", ":sticker_Sticker,_Broken_Max,_Oh_no,_Max_looks_sad:": "https://media.discordapp.net/stickers/982009265965371394.png?size=240", ":sticker_Sticker,_MaP_dEpEnDEnT,_It's_MaP_DepEnDEnT:": "https://media.discordapp.net/stickers/884998800450674698.png?size=320", ":sticker_Sticker,_JESS_She_Can!,_But_can_she_though?!_:": "https://media.discordapp.net/stickers/1052067797699670106.png?size=240", ":sticker_Sticker,_Sonja_Headpats,_:": "https://media.discordapp.net/stickers/1191498781879971970.png?size=240", ":sticker_Sticker,_Eagle_Pog,_Eagle_Pog:": "https://media.discordapp.net/stickers/865007175373684736.png?size=240", ":sticker_Sticker,_Nell_Smiles,_Nell_Smiles:": "https://media.discordapp.net/stickers/865313046750167050.png?size=320", ":sticker_Sticker,_Winter_Is_Coming,_Winter_is_Coming:": "https://media.discordapp.net/stickers/870091457241972756.png?size=240", ":sticker_Sticker,_Jugger_Spin,_:": "https://media.discordapp.net/stickers/899528896364576828.png?size=240", ":sticker_Sticker,_Drake_Peter,_Hey_Lois!_I'm_a_CO_now!_I_could_even_build_a_boat.:": "https://media.discordapp.net/stickers/911393972331626506.png?size=240", ":sticker_Sticker,_Sacks,_Sacks_sticker,_oh_no_:": "https://media.discordapp.net/stickers/911397326373941298.png?size=240", ":sticker_Sticker,_Andy'll_fix_it,_He_might_not_know_what_an_airport_is,_but_he_can_still_fix_airplanes_:": "https://media.discordapp.net/stickers/911411093551841321.png?size=240", ":sticker_Sticker,_Eat_Free_Dudes,_Eat_Free_Dudes,_Woah_Whoa_:": "https://media.discordapp.net/stickers/915041510758707220.png?size=240", ":sticker_Sticker,_Grimm's_Cracker_Tank,_Grimm_has_no_brakes_and_all_gas:": "https://media.discordapp.net/stickers/915042999011016704.png?size=320", ":sticker_Sticker,_Popcorn_Pengu,_Mmmmm,_Popcorn:": "https://media.discordapp.net/stickers/916765803074973727.png?size=320", ":sticker_Sticker,_Sen-Tzu,_:": "https://media.discordapp.net/stickers/919524365798875156.png?size=240", ":sticker_Sticker,_Kindle_Tee_Hee_Hee,_Tee_Hee_Hee:": "https://media.discordapp.net/stickers/921988482409308190.png?size=320", ":sticker_Sticker,_Arty_SPAM,_:": "https://media.discordapp.net/stickers/931809205629894707.png?size=240", ":sticker_Sticker,_Rocket_Girl_Rachel,_Yeeeee-Haaaaaw!!!:": "https://media.discordapp.net/stickers/933750973074145340.png?size=240", ":sticker_Sticker,_They're_Grrrit!,_:": "https://media.discordapp.net/stickers/934591343290896466.png?size=240", ":sticker_Sticker,_Salt_Bei,_:": "https://media.discordapp.net/stickers/937089142439956502.png?size=240", ":sticker_Sticker,_Sturm_YES!,_:": "https://media.discordapp.net/stickers/941727905787052043.png?size=320", ":sticker_Sticker,_Let's_Go_Flak,_Let's_Go_Beeches!!!:": "https://media.discordapp.net/stickers/942093278969487410.png?size=320", ":sticker_Sticker,_That_Face_When...,_Oh_Noes!_You_broke_through_my_wall!:": "https://media.discordapp.net/stickers/956714739487113286.png?size=320", ":sticker_Sticker,_Worth_it_Flak,_Flak_Approved:": "https://media.discordapp.net/stickers/992543540800397403.png?size=240", ":sticker_Sticker,_Clone_Andy,_Knows_what_an_airport_is:": "https://media.discordapp.net/stickers/1021971606702141630.png?size=240", ":sticker_Sticker,_Adder_Comin_Atcha!!!,_SIDESLIIIIIP!!!:": "https://media.discordapp.net/stickers/1062818946065104936.png?size=320", ":sticker_Sticker,_Koal,_Road_Warrior,_Hail_to_the_King_Baby!_:": "https://media.discordapp.net/stickers/1066063830368665630.png?size=240", ":sticker_Sticker,_Excited_Lash,_Lash_is_excited!_Are_YOU?!:": "https://media.discordapp.net/stickers/1094033384482811924.png?size=320", ":sticker_Sticker,_NO_U!,_:": "https://media.discordapp.net/stickers/1099338797608616057.png?size=320", ":sticker_Sticker,_Yeet_your_troops_NOW!,_:": "https://media.discordapp.net/stickers/1103896411612921926.png?size=320", ":sticker_Sticker,_STOP_IT!!!,_Permission_received_from_artist:_https://twitter.com/nekoznekoVEVO:": "https://media.discordapp.net/stickers/1152033392020439050.png?size=240", ":sticker_Sticker,_Rachel_was_Sturm!!!,_:": "https://media.discordapp.net/stickers/1183999834441666570.png?size=240", ":sticker_Sticker,_Jess_Headcannon_⭐,_:": "https://media.discordapp.net/stickers/1184154162213158935.png?size=240", ":sticker_Sticker,_Kindle_again⭐,_People_just_talk_about_Kindle_so_much._:": "https://media.discordapp.net/stickers/1240134069740638229.png?size=240", ":sticker_Sticker,_Oh_You!_(Hawke_&_Lash)_⭐,_:": "https://media.discordapp.net/stickers/1283498204561936477.png?size=240", ":sticker_Sticker,_Rock_the_Block_Jake_⭐,_:": "https://media.discordapp.net/stickers/1306822791982616639.png?size=240", ":sticker_Sticker,_Trust_Grimm,_:": "https://media.discordapp.net/stickers/1343586354130456587.png?size=240", ":sticker_Sticker,_Cash_Money_Colin!,_:": "https://media.discordapp.net/stickers/1364055591877873717.gif?size=320", ":sticker_Sticker,_Speedrunner_Grimm,_:": "https://media.discordapp.net/stickers/1374185750332964884.png?size=240", ":sticker_Sticker,_Sami_No_Victory_March_⭐,_:": "https://media.discordapp.net/stickers/1401285443953229844.png?size=320", ":sticker_Sticker,_⭐_GS_Finger_Guns_,_:": "https://media.discordapp.net/stickers/1401285649876652033.png?size=240", ":sticker_Sticker,_⭐_Sasha_War_Funds_,_:": "https://media.discordapp.net/stickers/1401286479665299527.png?size=240", ":sticker_Sticker,_⭐_Ghost_Koal_,_:": "https://media.discordapp.net/stickers/1401286890652700712.png?size=240", ":sticker_Sticker,_Sasha_Hug,_Woah,_Big_Sister_Sasha!:": "https://media.discordapp.net/stickers/873365332318879776.png?size=320", }; function renderChatMessage(text) { // Convert non-breaking spaces back to normal spaces text = text.replace(/\u00A0/g, ' '); // Replace all codes with <img> tags Object.keys(gifMap).forEach(code => { const imgTag = `<img src="${gifMap[code]}" alt="${code}" style="width: 60px; height: auto; vertical-align: middle;">`; text = text.replaceAll(code, imgTag); }); return text; } function makeDraggable(element) { let isDragging = false; let offsetX = 0, offsetY = 0; const resizeMargin = 10; // px from edges to reserve for resizing element.addEventListener('mousedown', function(e) { // Only left-click drag if (e.button !== 0) return; if (e.target.closest('textarea, input, select, label')) return; const rect = element.getBoundingClientRect(); const onRightEdge = e.clientX > rect.right - resizeMargin; const onBottomEdge = e.clientY > rect.bottom - resizeMargin; // If clicking near the right/bottom edge, let resize happen if (onRightEdge || onBottomEdge) return; isDragging = true; offsetX = e.clientX - rect.left; offsetY = e.clientY - rect.top; element.style.cursor = 'grabbing'; e.preventDefault(); }); document.addEventListener('mousemove', function(e) { if (!isDragging) return; element.style.left = `${e.clientX - offsetX}px`; element.style.top = `${e.clientY - offsetY}px`; element.style.right = ''; element.style.bottom = ''; }); document.addEventListener('mouseup', function() { if (isDragging) { isDragging = false; element.style.cursor = 'grab'; } }); element.style.cursor = 'grab'; element.style.position = 'fixed'; } function injectChatBox() { chatContainer = document.createElement('div'); chatContainer.id = 'awbw-chat-container'; chatContainer.style.cssText = ` position: fixed; top: 60px; right: 20px; width: 350px; height: 300px; background: #f9f9f9; border: 2px solid #aaa; border-radius: 10px; padding: 10px; z-index: 1000; box-shadow: 0 2px 10px rgba(0,0,0,0.3); resize: both; overflow: auto; min-width: 200px; min-height: 150px; `; chatContainer.style.resize = 'both'; chatContainer.style.overflow = 'auto'; document.body.appendChild(chatContainer); sendMessageContainer = document.createElement('div'); sendMessageContainer.id = 'awbw-send-message-container'; sendMessageContainer.style.cssText = ` position: fixed; top: 400px; right: 20px; width: 500px; max-height: 270px; overflow-y: auto; background: #f9f9f9; border: 1px solid #aaa; border-radius: 10px; padding: 10px; z-index: 1000; box-shadow: 0 2px 10px rgba(0,0,0,0.3); `; sendMessageContainer.style.resize = 'both'; sendMessageContainer.style.overflow = 'auto'; document.body.appendChild(sendMessageContainer); toggleButton = document.createElement('button'); toggleButton.innerHTML = 'Game Chat💬 <span id="awbw-unread-badge"></span>'; toggleButton.style.cssText = ` position: fixed; top: 30px; right: 30px; z-index: 1001; background: #0066cc; color: white; padding: 5px 10px; border: none; border-radius: 5px; font-size: 16px; cursor: pointer; `; toggleButton.onclick = toggleChatVisibility; document.body.appendChild(toggleButton); badge = toggleButton.querySelector('#awbw-unread-badge'); badge.style.marginLeft = '5px'; // Make draggable makeDraggable(chatContainer); makeDraggable(sendMessageContainer); makeDraggable(toggleButton); } function toggleChatVisibility() { isChatHidden = !isChatHidden; chatContainer.style.display = isChatHidden ? 'none' : 'block'; if (isYourChat) { sendMessageContainer.style.display = isChatHidden ? 'none' : 'block'; } if (!isChatHidden) { unreadCount = 0; updateBadge(); } } function updateBadge() { badge.textContent = unreadCount > 0 ? `(${unreadCount})` : ''; } function isUserAtBottom() { // How close to the bottom counts as "at the bottom" const threshold = 150; if (chatContainer.scrollHeight - chatContainer.scrollTop - chatContainer.clientHeight < threshold) { return true; } return false; } async function refreshChat() { return fetch(chatUrl) .then(res => res.text()) .then(html => { const tempDOM = new DOMParser().parseFromString(html, 'text/html'); const rawMessages = tempDOM.querySelectorAll('table[id^="showmsg_"]'); const currentMessageInChatContainer = chatContainer.querySelectorAll('.bubble').length; if (rawMessages.length > currentCount && isChatHidden) { unreadCount += rawMessages.length - currentCount; updateBadge(); } if (rawMessages.length > currentMessageInChatContainer) { const newMessages = Array.from(rawMessages).slice(currentMessageInChatContainer); // Only the new ones newMessages.forEach(msg => { chatContainer.appendChild(transformToBubble(msg)); }); if (!isChatHidden) { const isBottom = isUserAtBottom(); if (isBottom) { chatContainer.scrollTop = chatContainer.scrollHeight; } } } currentCount = rawMessages.length; }); } function getToPlayers(fromCell) { const toPlayers = []; const bTo = Array.from(fromCell.querySelectorAll('b')) .find(b => b.textContent.trim().startsWith('To:')); if (bTo) { // Iterate over the siblings after the <b>To:</b> until we hit another <b> or end let node = bTo.nextSibling; while (node) { if (node.nodeType === Node.ELEMENT_NODE) { if (node.tagName === 'B') break; // stop if next section starts if (node.tagName === 'IMG') { // Get the next text node after the <img> for the name let nameNode = node.nextSibling; while (nameNode && nameNode.nodeType !== Node.TEXT_NODE) { nameNode = nameNode.nextSibling; } if (nameNode) { const name = nameNode.textContent.trim(); if (name) toPlayers.push(name); } } } node = node.nextSibling; } } return toPlayers.length !== 0 ? toPlayers : ["All Player"]; } function transformToBubble(msgTable) { const fromCell = msgTable.querySelector('td:first-child'); const messageCell = msgTable.querySelector('td:last-child'); const senderMatch = fromCell?.innerText?.match(/From:\s*(.+)/u); const sender = senderMatch ? senderMatch[1] : 'Unknown'; const toPlayers = getToPlayers(fromCell); const isSelf = sender === userName; // Find timestamp let time = ''; let timeElem = msgTable.closest('tr')?.previousElementSibling; if (timeElem) { const timeSpan = timeElem.querySelector('.small_text'); if (timeSpan) { time = timeSpan.textContent.trim(); } } const bubble = document.createElement('div'); bubble.className = isSelf ? 'bubble right' : 'bubble left'; bubble.innerHTML = ` <div class="sender"><strong>From: ${sender}</strong></div> <div class="receiver">To: ${toPlayers.join(', ')}</div> <div class="content">${renderChatMessage(messageCell.textContent)}</div> <div class="timestamp">${time}</div> `; return bubble; } function injectStyle() { const style = document.createElement('style'); style.textContent = ` .bubble { max-width: 80%; padding: 10px; border-radius: 10px; margin: 6px; position: relative; background: #ffffff; box-shadow: 0 1px 3px rgba(0,0,0,0.1); word-wrap: break-word; font-size: 14px; } .bubble.right { background: #dcf8c6; margin-left: auto; text-align: left; } .bubble.left { background: #f1f0f0; margin-right: auto; text-align: left; } .bubble .sender { font-weight: bold; margin-bottom: 5px; font-size: 12px; } .bubble .receiver { margin-bottom: 10px; color: blue; font-size: 12px; border-bottom: 2px solid #000; } .timestamp { font-size: 0.7em; color: gray; text-align: right; margin-top: 4px; } `; document.head.appendChild(style); } async function fetchAndInsertMessageForm(container, gamesId) { const response = await fetch(`/press.php?games_id=${gamesId}`); const text = await response.text(); const dom = new DOMParser().parseFromString(text, 'text/html'); // Get all recipients const checkboxes = dom.querySelectorAll('input[name="press_to_players_id[]"]'); const users = Array.from(checkboxes).map(cb => { const img = cb.parentNode.querySelector(`input[value="${cb.value}"] + img`); const anchor = img?.nextElementSibling; return { id: cb.value, name: anchor?.textContent?.trim() || 'Unknown', logo: img?.getAttribute('src')?.split('/').pop() || '', }; }); // Your player ID const playersIdInput = dom.querySelector('input[name="players_id"]'); const playersId = playersIdInput?.value || ''; const uniqId = dom.querySelector('input[name="uniq_id"]')?.value || ''; chatContainer.scrollTop = chatContainer.scrollHeight; if (users.length == 0) { isYourChat = false; sendMessageContainer = null; return; } // Insert form createMessageForm(container, gamesId, playersId, uniqId, users); } // Create emoji button container function createEmojiPicker() { const container = document.createElement('div'); container.style.display = 'flex'; container.style.flexWrap = 'wrap'; container.style.gap = '4px'; container.style.marginTop = '5px'; container.style.border = '1px solid #ccc'; container.style.padding = '5px'; container.style.maxHeight = '120px'; container.style.overflowY = 'auto'; container.style.background = '#fff'; container.style.borderRadius = '6px'; // Add emojis from Map gifMap.forEach((url, code) => { const img = document.createElement('img'); img.src = url; img.alt = code; img.title = code; img.style.width = '24px'; img.style.height = '24px'; img.style.cursor = 'pointer'; img.addEventListener('click', () => { const textarea = document.querySelector('#message-textarea'); // Change selector to your textarea if (textarea) { textarea.value += code + ' '; textarea.focus(); } }); container.appendChild(img); }); return container; } function createMessageForm(container, gamesId, playersId, uniqId, users) { const form = document.createElement('form'); form.method = 'POST'; form.action = '/press.php'; form.style.marginTop = '10px'; form.style.borderTop = '1px solid #ccc'; form.style.paddingTop = '10px'; let userCheckboxes = ''; users.forEach(user => { userCheckboxes += ` <label style="margin-right: 10px; display: inline-flex; align-items: center; cursor: pointer;"> <input type="checkbox" name="press_to_players_id[]" value="${user.id}" style="margin-right: 4px;"> <img src="terrain/ani/${user.logo}" style="vertical-align: middle; width: 20px; height: 20px; margin-right: 3px;"> ${user.name} </label> `; }); form.innerHTML = ` <div style="display: flex; flex-wrap: wrap; gap: 8px; max-height: 75px; overflow-y: auto; padding: 4px; border: 1px solid #ccc; background: #fafafa;"> ${userCheckboxes} </div> <div style="margin-top: 5px; display: flex; gap: 5px;"> <button type="button" id="emoji-btn" style="padding: 4px 8px;">😊</button> <textarea class="press" name="press_text" rows="5" style="flex: 1;" required></textarea> </div> <input type="hidden" name="players_id" value="${playersId}"> <input type="hidden" name="games_id" value="${gamesId}"> <input type="hidden" name="uniq_id" value="${uniqId}"> <div style="margin-top: 10px; text-align: right;"> <input type="submit" class="submit" value="Send Message"> </div> `; // Create popup container for emojis const popup = document.createElement("div"); popup.id = "emoji-popup"; popup.style.position = "absolute"; popup.style.width = "500px"; popup.style.maxHeight = "150px"; popup.style.overflowY = "auto"; popup.style.background = "#fff"; popup.style.border = "1px solid #ccc"; popup.style.padding = "5px"; popup.style.display = "flex"; popup.style.flexWrap = "wrap"; popup.style.gap = "5px"; popup.style.zIndex = "9999"; popup.style.boxShadow = "0 2px 5px rgba(0,0,0,0.2)"; // Position popup above the button const rect = popup.getBoundingClientRect(); const scrollTop = window.scrollY || document.documentElement.scrollTop; const scrollLeft = window.scrollX || document.documentElement.scrollLeft; popup.style.left = (rect.left + scrollLeft) + "px"; popup.style.top = (rect.top + scrollTop - 210) + "px"; // Populate popup with gifMap emojis for (const [code, url] of Object.entries(gifMap)) { const img = document.createElement("img"); img.src = url; img.alt = code; img.title = code; img.style.width = "32px"; img.style.height = "32px"; img.style.cursor = "pointer"; img.addEventListener("click", () => { const textarea = form.querySelector(".press"); textarea.value += ` ${code} `; popup.style.display = "none"; }); popup.appendChild(img); } // Append popup to body document.body.appendChild(popup); // Show popup on button click form.querySelector("#emoji-btn").addEventListener("click", (e) => { const rect = e.target.getBoundingClientRect(); const popupWidth = popup.offsetWidth; // get actual width popup.style.top = `${rect.top + window.scrollY}px`; popup.style.left = `${rect.left + window.scrollX - popupWidth - 520}px`; // shift left with small gap popup.style.display = popup.style.display === "none" ? "flex" : "none"; }); // Hide popup if clicking outside document.addEventListener("click", (e) => { if (!popup.contains(e.target) && e.target.id !== "emoji-btn") { popup.style.display = "none"; } }); // Handle form submission form.addEventListener('submit', async function (e) { e.preventDefault(); e.stopImmediatePropagation(); const selected = form.querySelectorAll('input[name="press_to_players_id[]"]:checked'); if (selected.length === 0) { alert("Please select at least one player before sending a message."); return; } const formData = new FormData(form); const res = await fetch(form.action, { method: 'POST', body: formData }); if (res.ok) { console.log("Message sent without page reload"); form.querySelector('.press').value = ''; refreshChat().then(() => { chatContainer.scrollTop = chatContainer.scrollHeight; }); } else { console.error("Message send failed"); } }); container.appendChild(form); } function main() { injectStyle(); injectChatBox(); refreshChat(); const originalLog = console.log; function customLog(...args) { // Detect the specific notification object if (args.length > 0 && typeof args[0] === 'object') { const data = args[0]; if (data.Notification?.action === 'Notification' && data.Notification?.newMessage) { refreshChat(); } } // Pass everything through to original log originalLog.apply(console, args); } // Hook into console.log console.log = customLog; // Auto-unhook when navigating away / closing tab window.addEventListener('beforeunload', () => { console.log = originalLog; }); const gamesId = new URLSearchParams(window.location.search).get('games_id'); fetchAndInsertMessageForm(sendMessageContainer, gamesId); toggleChatVisibility(); } main(); })();