1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <title>xBuddy Studio</title> 7 <link rel="icon" type="image/png" href="https://raph.tv/assets/play_add.png"> 8 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/fork-awesome.min.css" integrity="sha256-XoaMnoYC5TH6/+ihMEnospgm0J1PM/nioxbOUdnM8HY=" crossorigin="anonymous"> 9
9<script src="https://raph.tv/assets/jquery-3.6.3.min.js"></script>
9 10
10<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.form/4.3.0/jquery.form.min.js" integrity="sha512-YUkaLm+KJ5lQXDBdqBqk7EVhJAdxRnVdT2vtCzwPHSweCzyMgYV/tgGF4/dCyqtCC2eCphz0lRQgatGVdfR0ww==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
10 11
11<script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify"></script>
11 12
12<script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.polyfills.min.js"></script>
12 13 <link href="https://raph.tv/assets/tagify.css" rel="stylesheet" type="text/css" /> 14 <link rel="stylesheet" href="https://raph.tv/assets/colors-dark.css?x=1790717493" id="theme"> 15 <link rel="stylesheet" href="https://raph.tv/assets/style.css?x=1790717493"> 16 <link rel="stylesheet" href="https://raph.tv/assets/studio-style.css?x=1790717493"> 17 <link id="general_theme" rel="stylesheet" href="https://raph.tv/assets/rounded.css"> 18 <!-- ionicons --> 19
19<script type="module" src="https://unpkg.com/[email protected]/dist/ionicons/ionicons.esm.js"></script>
19 20
20<script nomodule src="https://unpkg.com/[email protected]/dist/ionicons/ionicons.js"></script>
20 21 <!-- / ionicons --> 22 <style type="text/css"> 23 html, body { 24 margin: 0; 25 background: linear-gradient(145deg, rgba(87,212,255,1) 0%, rgba(205,86,255,1) 100%); 26 background-position: center !important; 27 background-size: cover !important; 28 background-repeat: no-repeat !important; 29 user-select: none; 30 height: 100vh; 31 width: 100vw; 32 transition: background-image 0.2s ease-in-out; 33 } 34 .studio_content { 35 background: transparent !important; 36 backdrop-filter: blur(4px) brightness(0.5) contrast(1) saturate(1.1); 37 margin-top: 0; 38 height: 100%; 39 } 40 41 #connect_box { 42 background-color: #1f1f23a1 !important; 43 } 44 45 .fancy { 46 line-height: 0.5; 47 text-align: center; 48 overflow: hidden; 49 height: 50px; 50 display: flex; 51 align-items: center; 52 justify-content: flex-start; 53 margin: 0 25px; 54 } 55 56 .fancy span { 57 display: inline-block; 58 position: relative; 59 } 60 61 .fancy span:before, 62 .fancy span:after { 63 content: ""; 64 position: absolute; 65 height: 5px; 66 border-bottom: 1px solid #2a2a2a; 67 top: 0; 68 width: 600px; 69 } 70 71 .fancy span:before { 72 right: 100%; 73 margin-right: 15px; 74 } 75 76 .fancy span:after { 77 left: 100%; 78 margin-left: 15px; 79 } 80 81 #studio_body { 82 display: flex; 83 padding-top: 45px; 84 width: 100%; 85 height: 100%; 86 flex-direction: row; 87 } 88 89 input:not(input[type="radio"]):not(input[type="checkbox"]):hover, input:focus { 90 box-shadow: unset; 91 } 92 93 input:-webkit-autofill, 94 input:-webkit-autofill:focus { 95 transition: background-color 600000s 0s, color 600000s 0s; 96 } 97 98 input[data-autocompleted] { 99 background-color: transparent !important; 100 } 101 102 .user_autocomplete:hover{ 103 filter: drop-shadow(0px 0px 6px var(--mw-deep-dark)); 104 outline: var(--mw-general-border); 105 } 106 </style> 107</head> 108<body> 109<div id="studio_content" class="studio_content " style="margin: 0;width: 100%;"> 110 <div id="connect_box" style="position:fixed; max-width:400px; width: 100%; top:50%; left:50%; transform:translate(-50%, -50%); background-color:var(--mw-content-background); padding:40px; border-radius:12px;"> 111 <h2 style="text-align:center;"><img src="https://raph.tv/assets/play.png" style="height:30px; vertical-align:middle; margin-right:6px;" title="xBuddy"> xBuddy Studio</h2> 112 <form action="https://raph.tv/studio/connexion.php" method="POST" style="max-width:600px; margin:auto; margin-top:14px;position: relative;"> 113 <input type="hidden" name="return_page" value=""> 114 <div style="display: flex;flex-direction: row;justify-content: space-between;grid-gap: 10px;color: var(--mw-text);padding: 5px 15px;margin: 8px 0;width: 100%;border-radius: var(--mw-half-radius);font-size: 16px;outline: none;align-items: center;backdrop-filter: blur(20px);background-color: transparent;border: var(--mw-general-border);"> 115 <div style="display: flex;align-items: center;justify-content: center;"> 116 <img id="user_avatar" src="https://raph.tv/storage/user_avatar.jpg" style="width: 50px;height: 50px;border-radius: 100%;" /> 117 </div> 118 <div style="width: calc(100% - 80px);height: 100%;position: absolute;top: 0;bottom: 0;right: 0;"> 119 <input id="account_id" style="padding: 10px 0;background-color: transparent;margin: 0;height: 100%;" type="text" name="slug" placeholder="Adresse e-mail ou identifiant" required autocomplete="off"> 120 </div> 121 </div> 122 <div id="known_users" style="display: none;position: absolute;width: 100%;z-index: 1;top: 75px;max-height: 250px;overflow-y: auto;background: var(--mw-content-background);padding: 0px 5px;border-radius: var(--mw-half-radius);left: 2px;"></div> 123 <input type="password" name="password" placeholder="Mot de passe" required style="background-color: transparent;backdrop-filter: blur(20px);border: var(--mw-general-border);"> 124 <div style="display: flex;flex-direction: row;align-items: center;"> 125 <input id="permanent_cnx" type="checkbox" name="permanent_cnx"> 126 <label for="permanent_cnx" class="mw-txt txt-red" style="font-size: 12px;font-weight: bold;padding-left: 5px;">Reconnexion automatique sans mot de passe<br><small>(faire confiance à cet ordinateur)</small></label> 127 </div> 128 <input type="text" name="honeypot" value="" style="display: none;"> 129 <button class="button" type="submit">Se connecter</button>
130 </form> 131 <div style="position: absolute;text-align: center;width: 100%;left: 0;margin: 50px 0 0 -5px;"> 132 <a href="https://raph.tv" style="color: var(--mw-text);text-decoration: none;font-size: smaller;"> 133 <i class="fa fa-angle-double-left fa-fw" aria-hidden="true"></i>Retourner sur xBuddy </a> 134 </div> 135 </div> 136</div>
137<script type="text/javascript"> 138var known_users = localStorage.getItem('known_users'); 139 140if(known_users !== undefined || known_users !== null || known_users != ""){ 141 known_users = JSON.parse(known_users); 142 var users_html = ""; 143 144 known_users.forEach(function(user){ 145 146 users_html += `<div id="${user.uuid}" data-username="${user.slug}" class="user_autocomplete" style="display: flex;flex-direction: row;grid-gap: 10px;color: var(--mw-text);padding: 5px 15px;margin: 8px 0;width: 100%;border-radius: var(--mw-half-radius);font-size: 16px;align-items: center;backdrop-filter: blur(20px);background-color: var(--mw-content-background);border: var(--mw-general-border);cursor: pointer;">`; 147 users_html += ` <div style="display: flex;align-items: center;justify-content: center;">`; 148 users_html += ` <img src="${user.avatar}" style="width: 50px;height: 50px;border-radius: 100%;">`; 149 users_html += ` </div>`; 150 users_html += ` <div style="style="width: calc(100% - 80px);height: 100%;position: absolute;top: 0;bottom: 0;right: 0;display: flex;align-items: center;justify-content: flex-start;">`; 151 users_html += ` <div style="padding: 10px 0;background-color: var(--mw-content-background);margin: 0;height: 100%;display: flex;align-items: center;justify-content: flex-start;">`; 152 users_html += ` ${user.name}`; 153 users_html += ` </div>`; 154 users_html += ` <div style="position: absolute;right: 0;display: flex;height: 100%;align-items: stretch;top: 0;">`; 155 users_html += ` <div data-uuid="${user.uuid}" class="btn btn-sm" onClick="remove_account_list(this);" style="display: flex;align-items: center;">`; 156 users_html += ` <svg class="txt-red" style="cursor: no-drop;" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 512 512"><path fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32" d="M448 256c0-106-86-192-192-192S64 150 64 256s86 192 192 192s192-86 192-192Z"></path><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M320 320L192 192m0 128l128-128"></path></svg>`; 157 users_html += ` </div>`; 158 users_html += ` </div>`; 159 users_html += ` </div>`; 160 users_html += `</div>`; 161 }); 162 163 $('#known_users').html(users_html); 164} 165 166$('#account_id').on('click', function(){ 167 $('#known_users').show(); 168}); 169 170$(document).on('mousedown', function(event){ 171 if(!$(event.target).closest('#account_id, #known_users').length){ 172 $('#known_users').hide(); 173 } 174}); 175 176$('#account_id').on('input', function(){ 177 var inputVal = $(this).val().toLowerCase(); 178 var matched = false; 179 180 $('#known_users [data-username]').each(function(){ 181 var username = $(this).data('username').toLowerCase(); 182 if(username.includes(inputVal) && username !== inputVal){ 183 $(this).show(); 184 matched = true; 185 } else { 186 $(this).hide(); 187 } 188 }); 189 190 if(inputVal === ''){ 191 $('#known_users').show(); 192 } 193 else if(matched){ 194 $('#known_users').show(); 195 } 196 else{ 197 $('#known_users').hide(); 198 } 199}); 200 201var isRemoving = false; 202 203$('#known_users').on('click', '[data-username]', function(e){ 204 if(isRemoving){ 205 isRemoving = false; 206 return; 207 } 208 account_autocomplete(this); 209}); 210 211 212function account_autocomplete(e){ 213 var this_username = $(e).attr('data-username'); 214 $('#account_id').val(this_username); 215 doneTyping(); 216 $('#known_users').hide(); 217} 218 219function remove_account_list(e){ 220 isRemoving = true; 221 var known_users = JSON.parse(localStorage.getItem('known_users')) || []; 222 var this_uuid = $(e).attr('data-uuid'); 223 224 known_users = known_users.filter(function(user) { 225 return user.uuid !== this_uuid; 226 }); 227 228 localStorage.setItem('known_users', JSON.stringify(known_users)); 229 230 $('#'+this_uuid).detach(); 231 $('#account_id').val(''); 232 233 setTimeout(function(){ 234 isRemoving = false; 235 }, 100); 236} 237 238var typingTimer; 239var doneTypingInterval = 150; 240var $input = $('#account_id'); 241var dafault_user_avatar = $('#user_avatar').attr('src'); 242 243$input.on('keyup', function () { 244 clearTimeout(typingTimer); 245 typingTimer = setTimeout(doneTyping, doneTypingInterval); 246}); 247 248$input.on('keydown', function () { 249 clearTimeout(typingTimer); 250}); 251 252var last_input_account = ""; 253var last_avatar = ""; 254var last_banner = ""; 255 256function doneTyping(){ 257 let input_account = $('#account_id').val().toLowerCase(); 258 let original_input = input_account; // pour garder l'entrée dâorigine si besoin 259 260 let known_users = localStorage.getItem('known_users'); 261 let known_users_array = known_users ? JSON.parse(known_users) : []; 262 263 // Vérifier si l'input est une adresse mail valide 264 let emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; 265 let isEmail = emailPattern.test(input_account); 266 267 let isPseudoKnown = false; 268 269 if(isEmail){ 270 // Cherche un utilisateur dont l'email correspond 271 let matchedUser = known_users_array.find(user => user.email === input_account); 272 273 if(matchedUser){ 274 // On remplace input_account par le slug 275 input_account = matchedUser.slug; 276 isPseudoKnown = true; // car on a bien trouvé un slug connu 277 } 278 } 279 else{ 280 // Si ce n'est pas un email, on vérifie si câest un pseudo connu 281 isPseudoKnown = known_users_array.some(user => user.slug === input_account); 282 } 283 284 // Si on a quelque chose de valide 285 if(input_account != undefined && input_account != ''){ 286 if(isPseudoKnown){ 287 if(input_account != last_input_account){ 288 last_input_account = input_account; 289 $.ajax({
290 url: 'https://raph.tv/api/v0/account/@'+input_account, 291 type: 'GET', 292 contentType: "text/plain", 293 dataType: "text", 294 success: function(strJSON){ 295 let strJSONParsed = JSON.parse(strJSON); 296 let reponse = strJSONParsed.response; 297 298 if(reponse == "valid"){ 299 let pseudo = strJSONParsed.name; 300 let avatar = strJSONParsed.avatar.url; 301 let banner = strJSONParsed.banner.url; 302 303 last_avatar = avatar; 304 last_banner = banner; 305 306 $('#user_avatar').attr('src', avatar); 307 $('body').css({'background-image': 'url(' + banner + ')'}); 308 } 309 else{ 310 $('#user_avatar').attr('src', dafault_user_avatar); 311 $('body').css({'background-image': ''}); 312 } 313 }, 314 error: function(xx) { 315 console.log("Error"); 316 }, 317 }); 318 } 319 else{ 320 $('#user_avatar').attr('src', last_avatar); 321 $('body').css({'background-image': 'url(' + last_banner + ')'}); 322 } 323 } 324 else{ 325 $('#user_avatar').attr('src', dafault_user_avatar); 326 $('body').css({'background-image': ''}); 327 } 328 } 329 else{ 330 $('#user_avatar').attr('src', dafault_user_avatar); 331 $('body').css({'background-image': ''}); 332 } 333} 334 335$(document).ready(function(){ 336 doneTyping(); 337}); 338</script>
338 339</body>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.