Skip to content

Commit

Permalink
0.3.0
Browse files Browse the repository at this point in the history
1 error modification
2 minor changes
1 major change
  • Loading branch information
krynen committed Sep 14, 2017
1 parent 48b5fe8 commit 8a8f788
Show file tree
Hide file tree
Showing 8 changed files with 322 additions and 107 deletions.
Binary file added images/badge/admin.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/badge/gmod.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/badge/staff.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
177 changes: 129 additions & 48 deletions lib/browserified.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,17 @@ configDefault = {
muteUser : ["Nightbot"], /* html에 표시하지 않을 유저 nickname
display-name과 트위치 id를 모두 사용 가능 */
deleteBanMsg : true, // ban된 유저의 메세지를 지우기
commands : [
{exe:"clear", msg:"!!clear"},
{exe:"theme", msg:"!!theme"}
], // 활성화시킬 명령어
replaceMsgs : [] // 봇 메세지 등을 대체
};



/* 메세지 출력 함수 정의 */
var numChat = 0;
/* addChatMessage(nick, message[, data]) */
var replaceMsgFormat = function(message, amount) {
if (typeof amount != "number") { amount = 0; }

Expand All @@ -68,13 +71,14 @@ addChatMessage = function(nick, message, data) {
chatNicknameBox.classList.add("chat_nickname_box");
var chatBadgeBox = document.createElement("div");
chatBadgeBox.classList.add("chat_badge_box");
var chatInnerBox = document.createElement("div");
chatInnerBox.classList.add("chat_inner_box");
var chatUpperBox = document.createElement("div");
chatUpperBox.classList.add("chat_upper_box");
var chatMessageBox = document.createElement("div");
chatMessageBox.classList.add("chat_msg_box");
var chatLowerBox = document.createElement("div");
chatLowerBox.classList.add("chat_lower_box");
var chatOuterBox = document.createElement("div");
chatOuterBox.classList.add("chat_outer_box");
if (data.clip) { chatOuterBox.classList.add("clip_included"); }
if (data.nick) { chatOuterBox.classList.add("user_"+data.nick); }


Expand All @@ -98,24 +102,36 @@ addChatMessage = function(nick, message, data) {
data.badges.toString().split(",").forEach( function(element, index, array) {
var chatBadge = document.createElement("img");

if (element.search("broadcaster") == 0) { // 스트리머(/1)
if (element.search("staff") == 0) { // 스태프(스패너, 미확인)
chatBadge.src = "./images/badge/staff.png";
}
else if (element.search("globalmod") == 0) { // 글로벌 모드(도끼, 미확인)
chatBadge.src = "./images/badge/gmod.png";
}
else if (element.search("global-moderator") == 0) { // 글로벌 모더레이터(방패, 미확인)
chatBadge.src = "./images/badge/admin.png";
}
else if (element.search("admin") == 0) { // 어드민(방패, 미확인)
chatBadge.src = "./images/badge/admin.png"; // 어느쪽이 맞는지 확인해야함
}
else if (element.search("broadcaster") == 0) { // 스트리머(/1)
chatBadge.src = "./images/badge/broadcaster.png";
}
else if (element.search("moderator") == 0) { // 진은검(/1)
else if (element.search("moderator") == 0) { // 진은검(/1)
chatBadge.src = "./images/badge/mod.png";
}
else if (element.search("partner") == 0) { // 인증됨(/1)
else if (element.search("partner") == 0) { // 인증됨(/1)
chatBadge.src = "./images/badge/verified.png";
}
else if (element.search("premium") == 0) { // 프라임(/1)
else if (element.search("premium") == 0) { // 프라임(/1)
chatBadge.src = "./images/badge/prime.png";
}
else if (element.search("turbo") == 0) { // 터보(/1)
else if (element.search("turbo") == 0) { // 터보(/1)
chatBadge.src = "./images/badge/turbo.png";
}
else {
var value = element.replace(/[^1-9]*(\d)/, "$1");
if (element.search("subscriber") == 0) { // 구독자(/0, /3, /6, ...)
if (element.search("subscriber") == 0) { // 구독자(/0, /3, /6, ...)
switch (value)
{
case 0: // 별
Expand All @@ -126,7 +142,7 @@ addChatMessage = function(nick, message, data) {
break;
}
}
else if (element.search("bits") == 0) { // 비트 뱃지(/1, /10, /100, ...)
else if (element.search("bits") == 0) { // 비트 뱃지(/1, /10, /100, ...)
var value = element.replace(/[^1-9]*(\d)/, "$1");
chatBadge.src = "./images/badge/bits" + value + ".png";
}
Expand All @@ -138,19 +154,19 @@ addChatMessage = function(nick, message, data) {
chatBadgeBox.classList.add("empty");
}
if (data.clip) {
chatMessageBox.innerHTML = data.clip + chatMessageBox.innerHTML;
chatLowerBox.innerHTML = data.clip + chatLowerBox.innerHTML;
}
if (data.subMonths != undefined) {
chatMessageBox.innerHTML =
chatLowerBox.innerHTML =
'<div class="chat_subscribe_box">' +
replaceMsgFormat(configData.subMonthsMsg, data.subMonths) +
"</div>" + chatMessageBox.innerHTML;
"</div>" + chatLowerBox.innerHTML;
}
if (data.cheers != undefined) {
chatMessageBox.innerHTML =
chatLowerBox.innerHTML =
'<div class="chat_cheer_box">' +
replaceMsgFormat(configData.cheersMsg, data.cheers) +
"</div>" + chatMessageBox.innerHTML;
"</div>" + chatLowerBox.innerHTML;
}
}
if ( chatMessageBox.innerHTML.replace(/(<[^>]*>)|\s/g,"").length == 0) {
Expand All @@ -159,12 +175,14 @@ addChatMessage = function(nick, message, data) {


// 페이지에 Element 연결
chatInnerBox.appendChild(chatNicknameBox);
chatInnerBox.appendChild(chatBadgeBox);
chatOuterBox.appendChild(chatInnerBox);
chatOuterBox.inner = chatInnerBox;
chatOuterBox.appendChild(chatMessageBox);
chatOuterBox.msg = chatMessageBox;
chatUpperBox.appendChild(chatNicknameBox);
chatUpperBox.appendChild(chatBadgeBox);
chatOuterBox.appendChild(chatUpperBox);
chatOuterBox.upper = chatUpperBox;
chatOuterBox.appendChild(chatLowerBox);
chatOuterBox.lower = chatLowerBox;
chatLowerBox.appendChild(chatMessageBox);
chatLowerBox.msg = chatMessageBox;
document.getElementById("chat_wrapper").appendChild(chatOuterBox);


Expand Down Expand Up @@ -194,7 +212,7 @@ var concatChatMessage = function(nick, message, data) {
var lChild = document.getElementById("chat_wrapper").lastChild;
if (lChild && lChild.getElementsByClassName("chat_nickname_box")[0].innerHTML == nick) {
if (typeof applyMessage != "undefined") { message = applyMessage(message, data); }
with (lChild.getElementsByClassName("chat_msg_box")[0]) {
with (lChild.lower.msg) {
innerHTML += "\n\n" + message;
style.maxHeight = "none";
}
Expand All @@ -207,7 +225,7 @@ var banChatMessage = function(nick) {
if (children && children.length > 0) {
for (var index in children) {
if (isNaN(Number(index))) { continue; }
children[index].getElementsByClassName("chat_msg_box")[0].innerHTML =
children[index].lower.msg.innerHTML =
"&lt;message deleted&gt;";
}
}
Expand Down Expand Up @@ -255,8 +273,8 @@ var checkComplete = function() {
{ badges:[], escape:false }
)
if (chat != null) {
chat.inner.style.display = "none";
chat.msg.style.maxHeight = "none";
chat.upper.style.display = "none";
chat.lower.msg.style.maxHeight = "none";
}
checkComplete = function(){};
}
Expand Down Expand Up @@ -318,28 +336,43 @@ if ((configData.replaceMsgs) && (configData.replaceMsgs.length>0)) {
}



testtt = 0;
/* CSS 로드 */
{
var loadCss = function() {
var loadCss = function(isRetrying) {
// 재 로드를 위해 기존 css를 제거
var existings = document.getElementsByClassName("chat_theme");
for(var index=0; index<existings.length; ++index) {
existings[index].remove();
}

document.head.appendChild( function() {
if (configData.themeURI == "") { configData.themeURI = "./theme/"; }
else if (configData.themeURI[configData.themeURI.length-1] != "/") {
configData.themeURI += "/";
}

document.head.appendChild( function() {
if (configData.themeURI == "") { configData.themeURI = "./theme/"; }
else if (configData.themeURI[configData.themeURI.length-1] != "/") {
configData.themeURI += "/";
}

var ret = document.createElement("link");
ret.rel = "stylesheet";
ret.href = configData.themeURI + configData.theme + "/theme.css";
ret.onload = function() {
debugLog(configData.themeName + " 테마를 적용했습니다.");
checkComplete();
};
return ret;
}() );
}();
}
var ret = document.createElement("link");
ret.onload = function() {
debugLog(configData.themeName + " 테마를 적용했습니다.");
checkComplete();
};
ret.onerror = function() {
debugLog("테마 적용에 실패했습니다.");
if (isRetrying != true) {
debugLog("기본 설정으로 테마 설정을 재시도합니다.");
configData.theme = configDefault.theme;
loadCss(true);
}
};

ret.rel = "stylesheet";
ret.href = configData.themeURI + configData.theme + "/theme.css";
ret.classList.add("chat_theme");

return ret;
}() );
};
loadCss();



Expand Down Expand Up @@ -446,6 +479,9 @@ if (configData.loadTwitchCons) {
);
}
}
newMessage =
newMessage +
message.substring(Number(rangeIds[rangeIds.length-1][0].split("~")[1]) + 1);

return newMessage;
}
Expand Down Expand Up @@ -619,14 +655,41 @@ else {



/* 명령어 정의 */
var commandExecute = function(exe, arg) {
switch (exe) {
case "clear" :
manageMessage("@ : CLEARCHAT #\n");
return true;

case "theme" :
arg = arg.match(/[a-zA-Z0-9_-]+/)[0];
if (arg != null) {
configData.theme = arg;
loadCss();
return true;
}
else {
debugLog("잘못된 테마가 입력되었습니다.");
return false;
}

default:
debugLog("잘못된 명령어입니다.");
return false;
}
}



/* IRC 클라이언트 설정 */
var joinCount = 0;
defaultColors = [
"#FF0000", "#0000FF", "#00FF00", "#B22222", "#FF7F50",
"#9ACD32", "#FF4500", "#2E8B57", "#DAA520", "#D2691E",
"#5F9EA0", "#1E90FF", "#FF69B4", "#8A2BE2", "#00FF7F"];
debugLog("트위치에 접속을 시도합니다.");
testSocket = function() {};
manageMessage = function() {}; // 받은 명령어 처리 함수
var client = (function() {
ws = new WebSocket(configData.webSocket);

Expand Down Expand Up @@ -733,6 +796,24 @@ var client = (function() {
if (match != undefined) break;
}

// 명령어 파싱
if (configData.commands.length > 0) {
if (data.badges.toString().search("broadcaster") != -1) {
var isBreak = false;
for(var index in configData.commands) {
var cmd = configData.commands[index];
if (message.search(cmd.msg) == 0) {
var cmdText = cmd.exe;
var cmdArgument = message.split(cmd.msg)[1];

isBreak = isBreak || commandExecute(cmdText, cmdArgument);
}
}

if (isBreak) break;
}
}

// 클립 링크 파싱
var clip = message.match(/(https?:\/\/)?clips\.[a-zA-Z0-9./]*/g);
if (clip!=null) {
Expand Down Expand Up @@ -855,7 +936,7 @@ var client = (function() {
} );
}
ws.onmessage = onmessageEventHandler;
testSocket = function(string) {
manageMessage = function(string) {
var evt = {};
evt.data = string;
onmessageEventHandler(evt);
Expand Down
4 changes: 4 additions & 0 deletions lib/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ configData = {
allMessageHandle : /*false*/true,
muteUser : ["Nightbot"],
deleteBanMsg : true,
commands : [
{exe:"clear", msg:"!!clear"},
{exe:"theme", msg:"!!theme"}
],
replaceMsgs : [
{orig:/^![a-zA-Z]+/, to:"{no_display}"} // 봇 호출 영문 메세지 미표시
]
Expand Down
44 changes: 38 additions & 6 deletions readme.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,30 @@
********************** 패 치 노 트 **********************
* *
* ********************************************** *
* * 0.2.4 : 9th Sep 2017 * *
* * 0.3.0 : 14th Sep 2017 * *
* ********************************************** *
* 추가된 기능 *
* - 채팅방 명령어 활성화 *
* clear : 채팅방 청소 *
* (/clear 입력시 트위치 채팅방과 동시에 청소됨) *
* theme 테마폴더이름 : 테마 변경 *
* configData.commands에서 대응 명령어를 바꿀 수 있음 *
* *
* 오류 수정 및 변경된 기능 *
* - cheer외의 아이콘을 사용한 후원 강조 메세지가 표시됨 *
* 이전 버전에선 이름에 대문자가 포함되어있을 경우 미표시 *
* - 주소에 숫자가 포함된 클립도 제대로 불러와짐 *
* - 기본 테마에서 클립 미리보기가 정상적으로 표시됨 *
* - 긴 메세지에서도 구독콘이 정상적으로 표시됨 *
* - admin, globalmod, staff 뱃지가 반영됨(미확인) *
* - 구독콘 바로 뒤 글자가 잘리는 문제 수정 *
* - 기능 추가를 위한 theme 양식 변경 *
* *
* 개발자를 위한 메세지 *
* - 채팅방 명령어 대응을 위해 테마 폴더명은 *
* /[a-zA-Z0-9_-]+/ 로 지어야 함 *
* - 긴 메세지의 하단이 여백없이 잘리는 문제의 해결을 위해 *
* 이하 사항이 변경됨 *
* .chat_inner_box가 .chat_upper_box로 개명 *
* .chat_msg_box 외부에 .chat_lower_box가 추가 *
* 이제 .chat_cheer_box 등은 .chat_lower_box 아래에 위치 *
* 기본 테마의 /* SOON DEPRECATED */ 부분 참고를 권장 *
* 0.3.x 이후 배포 테마는 호환성을 유지하지 않을 예정 *
* *
* *
********************** config.js 설정 **********************
Expand Down Expand Up @@ -117,6 +133,11 @@
* <message deleted>로 처리하기 *
* true, false *
* *
* ☆commands 채팅방 명령어 적용 *
* [{exe:"명령1", msg:"입력 명령어1"}, *
* {exe:"명령2", msg:"입력 명령어2"}] *
* 정규표현식을 알아야 사용할만 함 *
* *
* ☆replaceMsgs 특정 텍스트를 변환하기 *
* [{orig:"이전1", to:"이후1"}, *
* {orig:"이전2", to:"이후2"}] *
Expand All @@ -131,6 +152,17 @@
********************* Version History **********************
* *
* ********************************************** *
* * 0.2.4 : 9th Sep 2017 * *
* ********************************************** *
* 오류 수정 및 변경된 기능 *
* - cheer외의 아이콘을 사용한 후원 강조 메세지가 표시됨 *
* 이전 버전에선 이름에 대문자가 포함되어있을 경우 미표시 *
* - 주소에 숫자가 포함된 클립도 제대로 불러와짐 *
* - 기본 테마에서 클립 미리보기가 정상적으로 표시됨 *
* - 긴 메세지에서도 구독콘이 정상적으로 표시됨 *
* *
* *
* ********************************************** *
* * 0.2.3 : 8th Sep 2017 * *
* ********************************************** *
* 오류 수정 및 변경된 기능 *
Expand Down
Loading

0 comments on commit 8a8f788

Please sign in to comment.