-
Notifications
You must be signed in to change notification settings - Fork 0
/
comment_scroll_shogi_premium.js
307 lines (262 loc) · 7.01 KB
/
comment_scroll_shogi_premium.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
//********************************************************************************************
/**
* コメントスクロール(将棋プレミアム)
* @file comment_scroll_shogi_premium.js
* @brief コメントをニコ生風に流すスクリプト
* @author loft
*/
//********************************************************************************************
//フラグ 初期化完了
var _initDone=false;
//フラグ 初回表示完了
var _firstDrawDone=false;
//プレイヤー領域サイズ
var _width = 608;
var _height = 370;
//コメント色
var _color = 'white';
//取得済みコメントリスト
var _list = [];
//描画コメントtop段階定数
var _TOP_LEVEL = 30;
//描画中コメントtop段階リスト
var _topLevelList = [];
//定期処理間隔
var _interval = 500;
//定期処理
timerTick();
//********************************************************************************************
/**
* @brief 定期処理
* @author loft
*
* @return function
*/
//********************************************************************************************
function timerTick(){
//コメント取得
var drawlist = getComment();
if(Object.keys(drawlist).length == 0){
setTimeout(timerTick, _interval);//次回
return;
}
//初期化
if(!_initDone){
init();
_initDone = true;
}
//描画
draw(drawlist);
setTimeout(timerTick, _interval);//次回
}
//********************************************************************************************
/**
* @brief 初期化
* @author loft
*/
//********************************************************************************************
function init(){
var videoExist = true;
//コメント表示エリア指定
var scrollArea=document.getElementsByClassName('video_container');//要会員
if(scrollArea.length==0){
videoExist = false;
scrollArea=document.getElementsByClassName('main_content');//代替
}
//独自ID付与
scrollArea[0].id='comment_scroll_area';
//エリアサイズ取得
var obj = $("#comment_scroll_area");
obj.css("position", "relative");
obj.css("overflow", "hidden");
var width = ""+obj.css("width");
var height = ""+obj.css("height");
_width = width.replace("px","");
_height = height.replace("px","");
if(!videoExist){
_height = 800;
_color = 'black';//白地なので
}
logPut('init','width,height=' + _width + ',' + _height);
if(videoExist){
//お試し
$('embed').each(function(){
//$(this).attr('src',$(this).attr('src')+'?wmode=transparent');
})
}
}
//********************************************************************************************
/**
* @brief コメント取得
* @author loft
*/
//********************************************************************************************
function getComment(){
//コメント取得
var elements=document.getElementsByClassName('live_comment_content');
//今回表示するコメントのリスト
var drawlist = [];
//コメント処理
for(var i=0; i<elements.length; i++){
var element=elements[i];
//id
var id=element.id;
if(id in _list){//取得済みか?
continue;
}
//コメント
var text=element.children[0].innerHTML;
//取得済みリストに追加
_list[id]=text;
//今回表示するコメントリストに追加
drawlist[id] = text;
}
return drawlist;
}
//********************************************************************************************
/**
* @brief 描画
* @author loft
* @param[in] drawlist
*/
//********************************************************************************************
function draw(drawlist){
var drawNum = Object.keys(drawlist).length;//要素数
if(drawNum==0){
return;
}
var i=0;
for(key in drawlist){
if(!_firstDrawDone){//大量表示抑制
if(i < drawNum-4){
i++;
continue;
}
}
//アニメーション
var text = drawlist[key];
animate(key, text);
i++;
}
//初回描画終わり
_firstDrawDone=true;
}
//********************************************************************************************
/**
* @brief アニメーション
* @author loft
* @return function
*/
//********************************************************************************************
function animate(key, text){
var top = calcTop();
var obj = $(
"<pre id='"
// "<div id='"
+ key
+ "' style='"
+ "left:" + _width * 1 + "px;"
+ "position:absolute;"
+ "top:" + top + "px;"
+ "color:"+ _color
+ ";font-size:" + '25px'
+ ";font-weight:bold;text-shadow: black 1px 1px 1px;width:100%;z-index:99999;cursor:default'>"
+ text
//+ "</div>");
+ "</pre>");
$("#comment_scroll_area").append(obj);
var len = text.length;
var duration = 10000;
if(len > 10){
duration -= (len - 10) * 100;
}
if(duration < 4000){
duration = 4000;
}
var topLevel = Math.floor(top/_TOP_LEVEL);
_topLevelList[key] = topLevel;
logPut('animate', key + ' top=' + topLevel);
var width = obj.width();
obj.animate(
{
left: (parseInt(_width) + parseInt(width) + 100) * -1,
},
{
duration: duration,
easing: 'linear',
complete: function(){
$("#comment_scroll_area").remove("#" + key);
delete _topLevelList[key];
logPut('animate', 'remove : ' + key);
}
}
);
}
//********************************************************************************************
/**
* @brief 描画高さ算出
* @author loft
*
* @return function
*/
//********************************************************************************************
function calcTop(){
var top = 0;
var cnt = 0;
var drawingTopMax = getDrawingTopMax();//-1 ~
drawingTopMax += 1;
if(drawingTopMax > 7){
drawingTopMax = 1;
}
//while(cnt < 100){
top = Math.floor( Math.random() * _TOP_LEVEL + drawingTopMax * _TOP_LEVEL );
//var topLevel = Math.floor(top/_TOP_LEVEL);
//var ret = isOnlyTopLevel(topLevel)
//if(ret){
// return top;
//}
//cnt++;
//}
return top;
}
function getDrawingTopMax(){
var drawingTopMax = -1;
for(key in _topLevelList){
var drawingTopLevel = _topLevelList[key];
if(drawingTopLevel > drawingTopMax){
drawingTopMax = drawingTopLevel;
}
}
return drawingTopMax;
}
//********************************************************************************************
/**
* @brief 描画高さレベル重複チェック
* @author loft
*
* @param[in] top 未使用
*
* @return function
*/
//********************************************************************************************
function isOnlyTopLevel(topLevel){
for(key in _topLevelList){
var drawingTopLevel = _topLevelList[key];
if(topLevel == drawingTopLevel){
return false;//重複有り
}
}
return true;//重複なし
}
//********************************************************************************************
/**
* @brief ログ出力
* @author loft
*
* @param[in] funcName
* @param[in] str
*/
//********************************************************************************************
function logPut(funcName, str){
console.log('[c-loft.com][comment_scroll][' + funcName + '] ' + str);
}