您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
デュラチャ ルームログ保存&部屋リストとチャット人口を保存
// ==UserScript== // @name dr_Base // @namespace http://tampermonkey.net/ // @version 0.1 // @description デュラチャ ルームログ保存&部屋リストとチャット人口を保存 // @author You // @match http://drrrkari.com/* // // @grant GM_addStyle // ==/UserScript== // 'use strict'; // ================================================================================ // // 管理用クラス // // ================================================================================ class DrrkariCom{ constructor(){ console.log(' ___ ___'); console.log('/__/| /__/| __/ __/ __/ __/ __/ __/ __/ __/ __/ __/ __/ '); console.log(''); console.log('Tampermonkey drrrkari-com_*.js'); console.log('__/ __/ __/ __/ __/ __/ __/ __/ __/ __/ __/ __/ __/ '); this.switchUrl(); } switchUrl(){ let url = location.href; switch(url){ // top page case 'http://drrrkari.com/': break; // room list case 'http://drrrkari.com/lounge/': case 'http://drrrkari.com/lounge/#': case 'http://160.16.61.87/lounge/': case 'http://160.16.61.87/lounge/#': const lounge = new Lounge(); break; // chat room case 'http://drrrkari.com/room/': case 'http://drrrkari.com/room/#': case 'http://160.16.61.87/room/': case 'http://160.16.61.87/room/#': const inroom = new Inroom(); break; // お絵描きモード case 'http://drrrkari.com/room/?paintmode': //const paint = new Paintmode(); break; // 部屋作成画面 case 'http://drrrkari.com/create_room/': const createRoom = new CreateRoom(); break; } } } // ================================================================================ // // 部屋リスト // // ================================================================================ class Lounge{ constructor(){ this.population = null; this.profile = { name: null, icon: null, iconUrl: null }; console.log(this.getPopulation(), '人'); // 入室者数 //console.log(this.getProfile()); // プロフィール this.roomColor(); // 入室可能部屋を色分け this.toolboxUI(); // 情報表示 this.uiProfile(); // プロフィール表示部分のデザイン } getPopulation(){ this.population = document.querySelector('#main span').innerText.split('人')[0]; return this.population; } roomColor(){ // 点線非表示 //document.querySelectorAll('hr').forEach((e)=>{ e.style.display = 'none' }); // 入室可能と満員を色分け const rooms = document.querySelectorAll('.rooms'); let s = 0; if(location.href === 'http://160.16.61.87/lounge/' || location.href === 'http://160.16.61.87/lounge/#'){ // 別館の場合、最初の要素を除外 s = 1; } for(let i=s; i<rooms.length; i++){ rooms[i].style.padding = 0; // 行間を狭める const button = rooms[i].getElementsByTagName('button')[0]; // 青かオレンジのボタン。本館の雑談となりきり const button2 = rooms[i].querySelector('.button input'); // 白色角丸ボタン。本館BL、別館 // 色準備 const enterColor = '#2A9FD6'; const knockColor = '#F47C3C'; // 本館の、雑談、なりきり if(button){ // ボタンの高さを細くする(本館BLと同高さ) button.style.height = '24px'; button.style.padding = 0; // 色 if(button.value === 'login'){ rooms[i].style.borderLeft = `3px ${enterColor} solid`; } else if(button.value === 'knock'){ rooms[i].style.borderLeft = `3px ${knockColor} solid`; } } // 本館BL、別館 else if(button2){ rooms[i].style.overflow = 'hidden'; // .roomsの要素高さゼロ対策 // 入室ボタンデザインを本館雑談と同じにする button2.parentElement.style.paddingRight = 0; // ボタンの右端画像を消す button2.style.width = '100px'; button2.style.color = 'white'; button2.style.paddingLeft = '0px'; button2.style.borderRadius = '3px'; if(button2.name === 'login'){ button2.style.background = enterColor; // ボタンの色 rooms[i].style.borderLeft = `3px ${enterColor} solid`; // 部屋名の左に着色 } else if(button2.name === 'knock'){ button2.style.background = knockColor; rooms[i].style.borderLeft = `3px ${knockColor} solid`; } else{ console.warn('error'); } } // 満員の場合 else{ // 部屋名文字色を灰色 rooms[i].querySelector('.name').style.color = '#aaa'; } } } toolboxUI(){ // 追加機能UI領域作成 const toolbox = (()=>{ const toolbox = document.createElement('div'); toolbox.id = 'toolbox'; toolbox.style.fontSize = '14px'; toolbox.style.textAlign = 'left'; const b = document.createElement('b'); b.appendChild(document.createTextNode('ToolBox')); const hr = document.createElement('hr'); hr.className = 'dashed'; toolbox.appendChild(b); toolbox.appendChild(hr); fixed.parentElement.insertBefore(toolbox, fixed); return toolbox; })(); // HN表示 const hn = (()=>{ const eleProfile = document.getElementById('profile'); const hn = eleProfile.getElementsByClassName('name')[0].innerText; const p = document.createElement('p'); p.appendChild(document.createTextNode(hn)); toolbox.appendChild(p); document.title = hn; return hn; })(); // アイコンの種類表示 const iconType = (()=>{ const iconType = document.querySelector('#profile .icon img').src .split('_')[1] .split('.')[0]; const div = document.createElement('div'); div.appendChild(document.createTextNode(iconType)); toolbox.appendChild(div); return iconType; })(); } getRoominfo(room){ let roomname = room.getElementsByClassName('name')[0].innerText; let users = []; let lis = rooms[5].querySelectorAll('.users li'); for(var li of lis){ var icon = li.getElementsByTagName('img')[0].src // http://drrrkari.com/css/icon_kai.png .split('_')[1] // kai.png .split('.')[0]; // kai users.push({ 'name': li.innerText, 'icon': icon }); } let member = rooms[5].getElementsByClassName('member')[0].innerText.split('/'); let nowMember = member[0]; let maxMember = member[1]; let btnval = null; let rooms = document.querySelectorAll('.rooms'); let btn = rooms[2].getElementsByClassName('btn')[0]; if(btn){ btnval = btn.name; }else{ btnval = 'full'; } return{ 'roomname': roomname, 'users': users, 'nowMember': nowMember, 'maxMember': maxMember, 'btnval': btnval }; } uiProfile(){ GM_addStyle(` #profile{ position: fixed; right: 0; top: 0; width: 100px; border: solid 1px gray; } `); var profile = document.getElementById('profile'); //profile.style.position = 'fixed'; //profile.style.right = 0; //profile.style.top = 0; profile.style.width = '150px'; // 本館はGM_addStyleだけでは無効 //profile.style.border = 'solid gray 1px'; // 部屋リスト保存 var cRoom = new RoomList(); cRoom.createSaveButton(); } getProfile(){ var profile = document.getElementById('profile'); var name = profile.getElementsByClassName('name')[0].innerText; var img = profile.querySelector('.icon img'); var iconUrl = img.src; var icon = img.src // アイコンURL .split('/')[4] // アイコンファイル名 .split('.')[0] // アイコンファイル名(拡張子無し) .replace('icon_', ''); // 種類 this.profile = { name: name, icon: icon, iconUrl: iconUrl }; return this.profile; /* var icons = [ 'girl', 'moza', 'tanaka', 'kanra', 'usa', 'gg', 'orange', 'zaika', 'setton', 'zawa', 'neko', 'purple', 'kai', 'bakyura', 'neko2', 'numakuro', 'bm', 'bear', 'rab', 'nyan', 'muff', 'muff_nyan', ]; */ } } // ================================================================================ // // 入室中 // // ================================================================================ class Inroom{ constructor(){ this.info = { 'nowPopula': null, 'maxPopula': null, 'title': null, 'host': null, 'members': [] }; this.getRoomInfo(); this.cssMessageBox(); this.loadModule(); } loadModule(){ const log = new Log(); } // 部屋情報取得 getRoomInfo(){ // ルームタイトル、入室者数、最大人数 var room_name = document.getElementById('room_name').innerText; var delimiterStr = ' ('; var delimiterPos = room_name.lastIndexOf(delimiterStr); var title = room_name.substr(0, delimiterPos); var roomPopulation = room_name.substr(delimiterPos + delimiterStr.length, room_name.length) .replace(')', '').split('/'); var nowPopula = roomPopulation[0]; var maxPopula = roomPopulation[1]; // 入室者名 var memberlist = []; var membersLi = document.querySelectorAll('#members li'); for(var i=0; i<membersLi.length; i++){ var hn = membersLi[i].innerText; // ※トリップが取得されない // カンマ削除 if(i === membersLi.length - 1){ hn = hn.substr(0, hn.length); } else{ hn = hn.substr(0, hn.length - 2); } // host "name(host)"を"name"にする if(hn.lastIndexOf('(host)') !== -1){ var host = hn.substr(0, hn.length - 6); console.log('host:', host); } memberlist.push(hn); } this.info.nowPopula = nowPopula; this.info.maxPopula = maxPopula; this.info.title = title; this.info.host = host; this.info.members = memberlist; } // UI変更。発言領域左寄せ、ルームホスト表示 cssMessageBox(){ // 発言入力領域を左寄せ var message_box_inner = document.querySelector('.message_box_inner'); message_box_inner.style.float = 'left'; message_box_inner.style.margin = '0 10px'; if(0){ var uiarea = (function(){ var div = document.createElement('div'); div.id = 'uiarea'; div.style.width = '200px'; div.style.float = 'left'; div.style.border = 'solid gray 1px'; div.style.top = '20px'; div.style.left = '480px'; //var message_box = document.querySelector('.message_box'); //message_box.appendChild(document.createElement('br')); //message_box.appendChild(div); var body = document.querySelector('#body'); body.insertBefore(div, body.firstChild); return div; })(); $('#uiarea').draggable(); // ルームホストを表示する var p = document.createElement('p'); var host = (this.info.host === null)? '固定部屋': this.info.host; p.appendChild(document.createTextNode('host: ' + host)); uiarea.appendChild(p); } } } class Paintmode{ constructor(){ this.ui(); } ui(){ var saveAndSend = (function(){ var footer = document.getElementById('footer'); var btn = document.createElement('button'); btn.appendChild(document.createTextNode('saveAndSend')); footer.appendChild(btn); return btn; })(); var uSend = (function(){ var btn = document.createElement('button'); btn.appendChild(document.createTextNode('uSend')); btn.id = 'uSend'; footer.appendChild(btn); return btn; })(); uSend.addEventListener('click', this.send.bind(this), false); } save(){ var cav = document.getElementById('myCanvas'); var ctx = cav.getContext('2d'); ctx.save(); } load(){ var cav = document.getElementById('myCanvas'); var ctx = cav.getContext('2d'); ctx.restore(); } send(){ document.getElementById('sendc').click(); } } class CreateRoom{ constructor(){ this.init(); } init(){ document.querySelector('#room_name').focus(); var setting = { name: '', // 部屋名 type: 0, // ジャンル: 0 雑談 1 なりきり 2 BL limit: 15, // 定員: 1~15 knock: false, // ノック pass: '', // パスワード image: false // 画像機能 }; // 定員 document.querySelector('#limit').selectedIndex = setting.limit - 2; // 画像機能 var inpImages = document.getElementsByName('image'); if(setting.image){ inpImages[1].checked = 'checked'; } else{ inpImages[0].checked = 'checked'; } } } // ================================================================================ // // モジュール群 // // ================================================================================ // 入室中の発言保存 class Log{ constructor(){ this.createSaveButton(); this.setHref(); this.createSaveButtonBjson(); this.createSaveButtonB(); this.setHrefB(); } // =================================================================================== // A関数群 部屋のHTMLをパースして保存する関数群 // =================================================================================== // 保存用リンク作成 createSaveButton(){ var a = document.createElement('a'); a.id = 'aSave'; a.appendChild(document.createTextNode('save')); document.getElementsByClassName('menu')[0].appendChild(a); //document.querySelector('#uiarea').appendChild(a); a.addEventListener('click', this.createSaveButton_click.bind(this), false); } createSaveButton_click(e){ this.setHref(); // 保存した最新の発言に印を付ける機能 if(1){ document.querySelector('.talk').style = 'border-top:1px white solid'; } } setHref(){ var log = this.getTalksByTalksbox() + '\n\n\n\n\n' + this.getTalksByPmbox(); // 現在日時取得 var dt = new CDate(); var strDateTime = dt.getDate() + "_" + dt.getTime(); // -------------------------------------------------------- // ダウンロード用リンクにログデータを設定 // 部屋名取得。部屋名取得も汎用関数作る? var roomName = document.getElementById('room_name').innerText.split(' (')[0]; // 複数個所で、本館と別館の区別が必要なので、判断用の関数を作る? var serverType = '別館'; if(location.href === 'http://drrrkari.com/room/' || location.href === 'http://drrrkari.com/room/#'){ serverType = '本館'; } var blob = new Blob([ log ], { "type" : "text/plain" }); var a = document.getElementById('aSave'); a.download = strDateTime + '_' + serverType + '-tsv' + '_' + roomName + '.txt'; a.href = window.URL.createObjectURL(blob); // 保存したファイル名を表示 console.log('保存日時', strDateTime); } getTalksByTalksbox(){ var talks = document.querySelectorAll('#talks_box .talk'); var log = ''; for(let talk of talks){ var id = talk.id; // 画像 if(talk.querySelector('img')){ if(talk.querySelector('dt div')){ var icon = talk.className.split(' ')[1]; var name = talk.querySelector('dt').firstChild.nodeValue; var btns = talk.querySelectorAll('button'); var posttime = btns[0].innerText.replace('投稿時間: ', ''); var encip = btns[1].innerText.replace('IP: ', ''); var url = talk.querySelector('img').src; //console.log(id, posttime, encip, icon, name, url); var logLine = `${id}\t${posttime}\t${encip}\t${icon}\t${name}\t${url}`; //console.log(logLine); } else{ var icon = talk.className.split(' ')[1]; var name = talk.querySelector('dt').firstChild.nodeValue; var url = talk.querySelector('img').src; var logLine = `${id}\t\t\t${icon}\t${name}\t${url}\t`; } } // 普通の発言 else if(talk.querySelector('.body')){ if(talk.querySelector('dt div')){ var icon = talk.className.split(' ')[1]; var name = talk.querySelector('dt').firstChild.nodeValue; var btns = talk.querySelectorAll('button'); var posttime = btns[0].innerText.replace('投稿時間: ', ''); var encip = btns[1].innerText.replace('IP: ', ''); var talktext = talk.querySelector('.body').innerText; //console.log(id, posttime, encip, icon, name, talktext); var logLine = `${id}\t${posttime}\t${encip}\t${icon}\t${name}\t${talktext}`; //console.log(logLine); } else{ var icon = talk.className.split(' ')[1]; var name = talk.querySelector('dt').firstChild.nodeValue; var talktext = talk.querySelector('.body').innerText; var logLine = `${id}\t\t\t${icon}\t${name}\t${talktext}`; } } // 入退室、サイコロ else if(talk.className.indexOf('system') !== -1){ var txt = talk.innerText; var posend = txt.lastIndexOf('さん') - 3; var name = txt.substr(3, posend); var logLine = `${id}\t\t\tsystem\t${name}\t${txt}`; //console.log(logLine); } log += logLine + '\n'; } return log; } // 内緒の内容を取得してTSV形式で返す。※内緒画面を表示しておかないと取得不可 getTalksByPmbox(){ var log = ''; var talks = document.querySelectorAll('#pm_box .talk'); for(var i=0; i<talks.length; i++){ var talkId = talks[i].id; // 普通の発言 if(talks[i].querySelector('dt')){ var icon = talks[i].className.split(' ')[1]; //console.log(icon); var name = icon +"\t"+ talks[i].querySelector('dt').innerText; var txt = talks[i].querySelector('.body').innerText; } log += talkId +"\t\t\t"+ name +"\t"+ txt +"\n"; } return log; } // =================================================================================== // B関数群 JSONファイル保存用関数群 // =================================================================================== // B関数群は、2つの「ボタン」で構成。 // B1群:画面上表示が「getJson」ボタン。ID:btnGetJson。button要素で作成。 // B2群:画面上表示が「saveB」リンク。 ID:aSaveB。a要素で作成。 // 関数整理は、まずは2つあるボタンを1つに減らせないか? // それが出来なければ、関数先頭を「B1」にして関数名をシンプルに機能を明確化する? // ----------------------------------------------------------------------------------- // B1 button要素 // ※B1を無しにすると、最新のJSON取得できてない状態で保存されてしまうバグがある。 createSaveButtonBjson(){ var btn = document.createElement('button'); btn.id = 'btnGetJson'; btn.appendChild(document.createTextNode('getJson')); document.getElementsByClassName('menu')[0].appendChild(btn); //btn.addEventListener('click', this.createSaveButtonBjson_click.bind(this), false); btn.addEventListener('click', ()=>{ this.setHrefB(); // 保存した最新の発言に印を付ける if(0){ document.querySelector('.talk').style = 'border-top:1px white solid'; } }); } // ----------------------------------------------------------------------------------- // B2 a要素 createSaveButtonB(){ var a = document.createElement('a'); a.id = 'aSaveB'; a.appendChild(document.createTextNode('saveB')); document.getElementsByClassName('menu')[0].appendChild(a); //a.addEventListener('click', this.createSaveButtonB_click.bind(this), false); a.addEventListener('click', ()=>{ this.setHrefB(); }); } // ----------------------------------------------------------------------------------- // B関数群のコア関数群 setHrefB(){ document.getElementById('aSaveB').innerText = 'saveB'; // 通信中を判別できるようにする $.ajax({ type: 'POST', url: 'http://drrrkari.com/ajax.php', dataType: 'json', timeout: 12000, context: this, success: success, error: function(e){ console.log('ERROR!', e); } }); function success(json, status, xhr){ //console.log(json); console.log('talks', json.talks); console.log('users', json.users); var jsonStr = JSON.stringify(json, null, '\t'); var aSaveB = document.getElementById('aSaveB'); this.saveLog(aSaveB, 'json', jsonStr); // JSON取得成功したら表示を変化させる aSaveB.innerText = 'SaveB'; } } saveLog(link, logType, log){ // 現在日時取得 var dt = new CDate(); var strDateTime = dt.getDate() + "_" + dt.getTime(); // -------------------------------------------------------- // ダウンロード用リンクにログデータを設定 // 部屋名取得。部屋名取得も汎用関数作る? var roomName = document.getElementById('room_name').innerText.split(' (')[0]; // 複数個所で、本館と別館の区別が必要なので、判断用の関数を作る? var serverType = '別館'; if(location.href === 'http://drrrkari.com/room/' || location.href === 'http://drrrkari.com/room/#'){ serverType = '本館'; } var blob = new Blob([ log ], { "type" : "text/plain" }); //var a = document.getElementById('aSaveB'); link.download = strDateTime + '_' + serverType + '-' + logType + '_' + roomName + '.txt'; link.href = window.URL.createObjectURL(blob); // 保存したファイル名を表示 console.log('保存日時', strDateTime); } } class CDate{ getDate(){ var t = new Date(); var y = t.getFullYear(); var m = ( '00' + (t.getMonth() + 1) ).slice(-2) var d = ( '00' + t.getDate() ).slice(-2); //console.log(y, m, d); var dateString = y+'-'+m+'-'+d; // yyyy-dd-mm return dateString; } getTime(){ var t = new Date(); var h = ('00' + t.getHours() ).slice(-2); var m = ('00' + t.getMinutes() ).slice(-2);; var s = ('00' + t.getSeconds() ).slice(-2); //console.log(h+':'+m+':'+s); var timeString = h+m+s; // hh:mm:ss return timeString; } } class RoomList{ constructor(){ this.rooms = []; } createSaveButton(){ var profile = document.getElementById('profile'); var a = document.createElement('a'); a.id = 'aSaveRooms'; a.appendChild(document.createTextNode('saveRooms')); profile.appendChild(a); a.addEventListener('click', this.getRoomlist3.bind(this), false); } // 部屋リストを保存 getRoomlist2(){ var lounge = { // rooms = []; }; // 部屋リスト取得 var rooms = []; var eRooms = document.getElementsByClassName('rooms'); if(location.href === 'http://160.16.61.87/lounge/' || location.href === 'http://160.16.61.87/lounge/#'){ // 別館の場合、最初の要素を削除 eRooms[0].remove(); } for(var i=0; i<eRooms.length; i++){ // ----------------------------------------------- // ジャンル、部屋名、鍵部屋か var genre = eRooms[i].parentElement.id; var eName = eRooms[i].getElementsByClassName('name')[0]; var title = eName.innerText; var lock = (eName.getElementsByClassName('fa-lock')[0])? true: false; // ----------------------------------------------- // 入室者名 // 入室者名部分は本館と別館でクラス名が違う。 // しかし、要素の構造は同じなのでchildren[x]で見つけると、同一コードで対応できる。 var eUsers = eRooms[i].children[1].querySelectorAll('li'); var users = []; for(var j=0; j<eUsers.length; j++){ var username = eUsers[j].innerText; var ico = eUsers[j] .getElementsByTagName('img')[0] .src .replace('http://drrrkari.com/css/icon_', '') .replace('http://160.16.61.87/css/icon_', '') .replace('.png', ''); users.push({'name':username, 'icon':ico}); } var member = eRooms[i].getElementsByClassName('member')[0].innerText; // ----------------------------------------------- // 満員、入室、ノックボタン // 入室ボタン部分はBLとBL以外のジャンルでデザインが異なる。別館も異なる。 // 入室ボタンがある場所のテキストを取得する var eLogin = eRooms[i].getElementsByClassName('login')[0]; var button = eLogin.innerText.trim(); var roomid = 'unknown'; // 「満員」表示ではなかった場合。つまり、「ノック」か「入室」の表示 if(button !== '満員'){ // button要素が存在する場合 var button2 = eRooms[i].querySelector('.login button'); if(button2){ // ボタンのテキストを取得 button = button2.innerText; } // button要素が存在しない場合(旧デザインの処理。本館のBL、別館) else{ // input要素から状態を取得する button = eRooms[i].querySelector('.login input').value; } // ----------------------------------------------- // roomID // 「Uncaught TypeError: eRooms[i].getElementsByName is not a function at RoomList.getRoomlist2」 // 「eRooms[i].getElementsByName」を使おうとすると、TypeErrorが出る。 // 「var eRooms = document.getElementsByClassName('rooms');」で取得した var inp = eRooms[i].querySelector('[name=id]'); var roomid = inp.value; } // 前のバージョンのコード。消しても良い /*var inp = eRooms[i].querySelector('.login input'); var roomid = 'unknown'; if(inp){ var roomid = eRooms[i].querySelector('input').value; }*/ rooms.push({'title':title, 'lock':lock, 'genre':genre, 'users':users, 'member':member, 'button':button, 'roomid':roomid}); } //console.log(rooms); // デュラララチャット全体入室者数取得 lounge.url = location.href; var population = document.querySelector('#main span').innerText.split('人')[0]; // 入室者数。「~人がチャット参加中」の所 lounge.population = population; lounge.rooms = rooms; var jsonLounge = JSON.stringify(lounge, null, '\t'); //console.log(jsonRooms); // 現在日時取得 var dt = new CDate(); var strDateTime = dt.getDate() + "_" + dt.getTime(); // 部屋リストを保存する var blob = new Blob([ jsonLounge ], { "type" : "text/plain" }); var a = document.getElementById('aSaveRooms'); a.download = 'roomlist_' + strDateTime + '.txt'; a.href = window.URL.createObjectURL(blob); } getRoomlist3(){ var lounge = { // rooms = []; }; // 部屋リスト取得 var rooms = []; var eRooms = document.getElementsByClassName('rooms'); if(location.href === 'http://160.16.61.87/lounge/' || location.href === 'http://160.16.61.87/lounge/#'){ // 別館の場合、最初の要素を削除 eRooms[0].remove(); } // 準備処理。 ul.rooms要素に data-genre属性にジャンル情報を付加する事で、全ジャンル同一処理でジャンル分けを可能にする (function(){ // 固定部屋 let rooms = document.querySelectorAll('#fixed .rooms'); for(let room of rooms){ room.dataset.genre = 'fixed'; //console.log(room); } // 本館雑談ジャンルの処理。注意書きの上側と下側で分ける let e = document.querySelector('#zatsu .rooms'); let genre = 'zatsu1'; do{ // 部屋が無い場合はループを抜ける if(e === null){ break; } // UL要素の場合、ジャンル情報を付加 //console.log(e); if(e.tagName.toUpperCase() === 'UL'){ e.dataset.genre = genre; //console.log(e); } // 注意書きまで来たら、ジャンルを変更 else if(e.tagName.toUpperCase() === 'P'){ genre = 'zatsu2'; } // 雑談ジャンルの部屋を上から順に走査 e = e.nextElementSibling; }while(e); // 本館なりきり rooms = document.querySelectorAll('#rp .rooms'); for(let room of rooms){ room.dataset.genre = 'nari'; //console.log(room); } // 本館BL rooms = document.querySelectorAll('#bl .rooms'); for(let room of rooms){ room.dataset.genre = 'bl'; //console.log(room); } // 別館なりきり rooms = document.querySelectorAll('#nari .rooms'); for(let room of rooms){ room.dataset.genre = 'nari'; //console.log(room); } // 別館R15 rooms = document.querySelectorAll('#luv .rooms'); for(let room of rooms){ room.dataset.genre = 'r15'; //console.log(room); } })(); // 部屋情報取得メイン処理 for(var i=0; i<eRooms.length; i++){ // ----------------------------------------------- // ジャンル、部屋名、鍵部屋か var eName = eRooms[i].getElementsByClassName('name')[0]; var title = eName.innerText; var lock = (eName.getElementsByClassName('fa-lock')[0])? true: false; //var genre = eRooms[i].parentElement.id; var genre = eRooms[i].dataset.genre; // 準備処理の所で付加したジャンル情報を取得 // ----------------------------------------------- // 入室者名 // 入室者名部分は本館と別館でクラス名が違う。 // しかし、要素の構造は同じなのでchildren[x]で見つけると、同一コードで対応できる。 var eUsers = eRooms[i].children[1].querySelectorAll('li'); var users = []; for(var j=0; j<eUsers.length; j++){ var username = eUsers[j].innerText; var ico = eUsers[j] .getElementsByTagName('img')[0] .src .replace('http://drrrkari.com/css/icon_', '') .replace('http://160.16.61.87/css/icon_', '') .replace('.png', ''); users.push({'name':username, 'icon':ico}); } var member = eRooms[i].getElementsByClassName('member')[0].innerText; // ----------------------------------------------- // 満員、入室、ノックボタン // 入室ボタン部分はBLとBL以外のジャンルでデザインが異なる。別館も異なる。 // 入室ボタンがある場所のテキストを取得する var eLogin = eRooms[i].getElementsByClassName('login')[0]; var button = eLogin.innerText.trim(); var roomid = 'unknown'; // 「満員」表示ではなかった場合。つまり、「ノック」か「入室」の表示 if(button !== '満員'){ // button要素が存在する場合 var button2 = eRooms[i].querySelector('.login button'); if(button2){ // ボタンのテキストを取得 button = button2.innerText; } // button要素が存在しない場合(旧デザインの処理。本館のBL、別館) else{ // input要素から状態を取得する button = eRooms[i].querySelector('.login input').value; } // ----------------------------------------------- // roomID // 「Uncaught TypeError: eRooms[i].getElementsByName is not a function at RoomList.getRoomlist2」 // 「eRooms[i].getElementsByName」を使おうとすると、TypeErrorが出る。 // 「var eRooms = document.getElementsByClassName('rooms');」で取得した var inp = eRooms[i].querySelector('[name=id]'); var roomid = inp.value; } rooms.push({'title':title, 'lock':lock, 'genre':genre, 'users':users, 'member':member, 'button':button, 'roomid':roomid}); } //console.log(rooms); // デュラララチャット全体入室者数取得 lounge.url = location.href; var population = document.querySelector('#main span').innerText.split('人')[0]; // 入室者数。「~人がチャット参加中」の所 lounge.population = population; lounge.rooms = rooms; var jsonLounge = JSON.stringify(lounge, null, '\t'); //console.log(jsonRooms); // 現在日時取得 var dt = new CDate(); var strDateTime = dt.getDate() + "_" + dt.getTime(); // 部屋リストを保存する var blob = new Blob([ jsonLounge ], { "type" : "text/plain" }); var a = document.getElementById('aSaveRooms'); a.download = 'roomlist_' + strDateTime + '.txt'; a.href = window.URL.createObjectURL(blob); } } // ================================================================================ // // ここから実行 // // ================================================================================ const drr = new DrrkariCom();