๋์
์ด ๊ณผ์ ์ ๋ชฉํ๋ Stack Exchange์ ๋ํ๋ฐฉ์์ ์คํํ ์์๋ ์ฑ๋ด์ ๋ง๋๋ ๊ฒ์ ๋๋ค. ๋ด์ ์ฌ์ฉ์๊ฐ ํน์ ๋ช ๋ น์ ๊ฒ์ ํ ์์ ์ ๊ฐ์งํ๊ณ ์ด์ ์๋ต ํ ์ ์์ด์ผํฉ๋๋ค. ๋ค์์ ๋ช ๋ น ๋ชฉ๋ก์ด๋ฉฐ ๋ด์ด ์ํํด์ผ ํ ์์ ์ ๋๋ค.
!!newest:์ด ์ฌ์ดํธ์ ๊ฒ์ ๋ ์ต์ ์ง๋ฌธ์ ์ ๋ชฉ (๋งํฌ๋ ์์ง๋ง ์ ๋ชฉ)์ ์ถ๋ ฅํฉ๋๋ค (codegolf.SE).!!metanewest: ๋ฉํ ์ฌ์ดํธ (meta.codegolf.SE)์ ๊ฒ์ ๋ ์ต์ ์ง๋ฌธ์ ์ ๋ชฉ์ ์ถ๋ ฅํฉ๋๋ค.!!questioncount: ํ์ฌ ์ง๋ฌธ ๊ฐ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.!!metaquestioncount: ๋ฉํ ์ฌ์ดํธ์์ ํ์ฌ ์ง๋ฌธ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.!!tag tagname: ์ฒซ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ก ์ ๊ณต๋ ํ๊ทธ์ ํ๊ทธ ๋ฐ์ท (์งง์ ์ค๋ช )๋ฅผ ์ถ๋ ฅํฉ๋๋ค.!!metatag tagname: ์์ ๋์ผํ์ง๋ง ๋ฉํ ์ฌ์ดํธ ์ฉ.!!featured: ํ์๊ธ์ด์๋ ์ง๋ฌธ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.!!metafeatured: ๋ฉํ์ [featured] ํ๊ทธ ๊ฐ์๋ ์ง๋ฌธ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค .
๊ท์น
- ์ค ๋ํซ์ด๋ ํจ์๊ฐ ์๋ ์์ ํ ํ๋ก๊ทธ๋จ์ ์์ฑํด์ผํฉ๋๋ค.
- ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅ (์ ๋ ฅ, STDIN, ๋ช ๋ น ํ ์ธ์ ํ๋กฌํํธ)์ผ๋ก ์์ฒญํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Python ๋๋ Ruby๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํ์ํ์ง๋ง JavaScript๋ฅผ ์ฌ์ฉํ๊ณ ๋ํ๋ฐฉ ํ์ด์ง์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ์๋ ํ์ํ์ง ์์ต๋๋ค.
- WebSocket๊ณผ ๊ฐ์ ์์ ์ ์ํํ๊ธฐ ์ํด ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌธ์ ์๋ฅผ ๊ณ์ฐํ ํ์๊ฐ ์์ต๋๋ค.
-
๋น์ ์ ์์๋ ๋ฌธ์ ์์ ๋ํ ์นด์ดํธ๊ฐ ๊ทธ ๋ค์ ์ธ๋ถ ์ฑํ ๋ํผ๋ฅผ ์ฌ์ฉ (ํ์ง๋ง ๋น์ ์ ์์ ์ ์์ฑํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์). ๋ฉํผ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์๋ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ค๋ฉด, ๊ทธ๊ฒ์ ์์ ํ์ง ์๊ณ ์ฌ์ฉํ๊ณ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ธ์ด์ผํฉ๋๋ค (์์ ์ ๋ํผ๋ฅผ ์ฐ์ง ์๋ ๊ฒ์ ๋ํ ํ๋ํฐ์ ๋๋ค).
๋ฉํผ ์์ฒด์ ์ฝ๋ ๋ง ๊ณ์ฐํด์ผํฉ๋๋ค. ์์ ์ ๊ฐ์ ๋ค๋ฅธ ํ์ผ์ด ์์ผ๋ฉด ๊ณ์ฐํ ํ์๊ฐ ์์ต๋๋ค.
- URL ๋จ์ถ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ URL์ ์งง๊ฒ ๋ง๋ค ์์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ๋ฌธ์ ๋ URL์ ๊ณจํํ์ง ์๊ณ ์ฑ๋ด์ ๊ณจํํํ๋ ๊ฒ์ ๋๋ค.
- ์ฑํ ๋ฐ ๋ช ๋ น์ ์๋ตํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ป๋ ๋ฐ ํ์ํ ์น ์์ฒญ์ ์ ์ธํ๊ณ ์น ์์ฒญ์ด ์์ต๋๋ค.
- ์ ์ฌ์ฉ ๊ธฐ์ค โํ์ โ๋ ํ์ฉ๋์ง ์์ต๋๋ค.
- ๋๊ตฐ๊ฐ ๋ช
๋ น์ ๊ฒ์ํ๋ฉด ๋ค์ ํ์์ ์ฑํ
๋ฉ์์ง๋ก ์๋ตํด์ผํฉ๋๋ค
@user response. ๋ฐ๋ผ์ ๋ช ๋ น์ ์์ฑํ๊ณ!!featured5 ๊ฐ์ ์ถ์ฒ ์ง๋ฌธ์ด ์์ผ๋ฉด ๋ด์ด ๊ฒ์ํด์ผํฉ๋๋ค@ProgramFOX 5. - ๋ด์ ํ ์คํธํ๋ฉด ์ฑ๋ด ๊ณ์ ์์ ๋ด์ ์คํ ํ๊ณ ์ด ์ฑํ ๋ฐฉ ์์ ๋ด์ ์คํํฉ๋๋ค . ๋๋ ํญ์ ๊ทธ ๋ฐฉ์์ ๋ด์ ํ ์คํธ ํ ๊ฒ์ด๋ฏ๋ก ๋ฐฉ ID๋ฅผ ์ ๋ ฅ์ผ๋ก ์ ๊ณต ํ ํ์๋ ์์ผ๋ฉฐ ํญ์ 14697์ ๋๋ค.์ด ID๋ ์ ๋ ฅ์ผ๋ก ์ ๊ณต๋์ง ์์ผ๋ฉฐ ํ๋ ์ฝ๋ฉ๋์ด์ผํฉ๋๋ค.
- ๋ช
๋ น์ ์ฐพ์ ์ ์์ผ๋ฉด์ ์ถ๋ ฅํ์ญ์์ค
@user The command [command] does not exist. ๊ต์ฒด[command]๊ฐ ์๋ ๊ธฐ์กด ๋ช ๋ น์ ์ด๋ฆ์ผ๋ก. ๋ช ๋ น์ ์ธ์๊ฐ ์ ๊ณต๋๋ฉด ์ธ์๋ฅผ ์ถ๋ ฅํ์ง ๋ง๊ณ ๋ช ๋ น ์ด๋ฆ ๋ง ์ถ๋ ฅํ์ญ์์ค. - ๋ช ๋ น์ ์ฌ๋ฌ ์ธ์๊ฐ์๋ ๊ฒฝ์ฐ ํ์ํ์ง ์์ ์ธ์๋ ๋ฌด์ํ์ญ์์ค.
- ๋ช
๋ น์ ์ธ์๊ฐ ์ถฉ๋ถํ์ง ์์ผ๋ฉด ์ถ๋ ฅ
@user You have not provided enough arguments - ์์คํ ์ ์งง์ ์๊ฐ ๋ฒ์ ๋ด์ ์ค๋ณต ๋ฉ์์ง๊ฐ ๊ฒ์๋์ง ์๋๋กํฉ๋๋ค. ๋ฐ๋ผ์ ๋ด์ ํ ์คํธ ํ ๋ ๋์ผํ ์ถ๋ ฅ์ ์ฐ์์ ์ผ๋ก ์ ๊ณตํ๋ ๋ ๊ฐ์ ๋ช ๋ น์ ์คํํ์ง ์์ต๋๋ค (์ฆ, ์๋ฅผ ๋ค์ด ์ ์ ์ถ๊ฐํ์ฌ ๋ฉ์์ง๊ฐ ์ค๋ณต๋๋ฉด ๋ฉ์์ง๋ฅผ ๋ค๋ฅด๊ฒ ๋ง๋๋ ์์คํ ์ ๊ตฌํํ ํ์๊ฐ ์์์ ์๋ฏธํฉ๋๋ค).
- ์์คํ ์ ์งง์ ์๊ฐ ๋ฒ์ ๋ด์ ๋๋ฌด ๋ง์ ๋ฉ์์ง๊ฐ ๊ฒ์๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ฏ๋ก ํ ์คํธ ํ ๋ ์งง์ ์๊ฐ ๋ฒ์ ๋ด์ ๋๋ฌด ๋ง์ ๋ช ๋ น์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ฆ, ๋ด์ด์ด๋ฅผ ์ฒ๋ฆฌ ํ ํ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฒ์ํ๊ธฐ ์ ์).
- ์ด๊ฒ์ ๊ฐ์ฅ ์ ์ ์์ ๋ฐ์ดํธ๋ก ์น๋ฆฌํ๋ ํ๋ก๊ทธ๋จ ์ธ code-golf ์ ๋๋ค.
์์ํ๊ธฐ
๋ค์์ ๋ด ์์ฑ์ ์์ํ๊ธฐ์ํ ์ ๋ณด์ ๋๋ค. ์ด๊ฒ์ ์ฌ์ฉํ ํ์๋ ์์ง๋ง ์ง์นจ์ด ๋ ์ ์์ต๋๋ค.
- ๋ก๊ทธ์ธํ๋ ค๋ฉด ๋จผ์ OpenID ๊ณต๊ธ์์ ๋ก๊ทธ์ธํ์ญ์์ค. ์ด๊ฒ์ ํญ์ ์คํ ๊ตํ OpenID (
https://openid.stackexchange.com)์ ๋๋ค. ๋ก๊ทธ์ธ ์์์์ ์์ผ๋ฉฐhttps://openid.stackexchange.com/account/login์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ์ญ์์ค. - ๊ทธ๋ฐ ๋ค์์ ๋ก๊ทธ์ธํ์ญ์์ค
stackexchange.com. ๋ก๊ทธ์ธ ์์์์ ์์ต๋๋คhttps://stackexchange.com/users/login. ์คํ ๊ตํ์ OpenID ๊ณต๊ธ์๋ก ์ ํํ์ญ์์ค. - ๊ทธ๋ฐ ๋ค์ ๋ก๊ทธ์ธํ์ฌ ์ฑํ
ํ์ญ์์ค. ๋ก๊ทธ์ธ ์์์์ ์์ต๋๋ค
http://stackexchange.com/users/chat-login. ์คํ ๊ตํ์ OpenID ๊ณต๊ธ์๋ก ์ ํํ์ญ์์ค. - ๊ทธ๋ฐ ๋ค์์ ๋ฐ์์ผํฉ๋๋ค
fkey. ์ด๋ฅผ ์ํด, ์ด๋http://chat.stackexchange.com/chats/join/favorite๊ณผ๋ฅผ ์ป์ ์fkey์จ๊ฒจ์ง ์ ๋ ฅ ํ๋์์. - ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๋ ค๋ฉด์ ์์ฒญ์ ๋ณด๋ด๊ณ ๋ฉ์์ง ํ
์คํธ๋ฅผ ํฌํจ
http://chat.stackexchange.com/chats/14697/messages/newํ๋text๋งค๊ฐ ๋ณ์์๋ฅผ ํฌํจ ํ๋ ๋งค๊ฐ ๋ณ์ ๋ผ๋ ๋ ๊ฐ์ POST ๋งค๊ฐfkey๋ณ์๋ฅผ ์ ๊ณตํ์ญ์์คfkey. -
์ ๋ฉ์์ง๊ฐ ๊ฒ์๋๋์๊ธฐ๋ฅผ ํ์ธํ๋ ค๋ฉด WebSocket์ ์ฌ์ฉํ ์ ์์ต๋๋ค (๋จ, ๋ ์งง์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ฒ์ ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค). ์ด Meta Stack Exchange ๋ต๋ณ์ ์ฐธ์กฐํ์ญ์์ค .
์ก๋ด
(wss://chat.sockets.stackexchange.com/events/<roomnumber>/<somehash>?l=<timethingy>)๋ฃธ ID์ fkey๋ฅผ POSTํ์ฌ POST๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
http://chat.stackexchange.com/ws-authtimethingy๋์ ์ํด ๋ฐํ ๋ json์ ์๊ฐ ํค์ ๋๋ค
/chats/<roomno>/events.๋ฉ์์ง๊ฐ ๊ฒ์ ๋ ๋์ ์ด๋ฒคํธ ID๋์ ๋๋ค
1. - Doorknob ์ StackExchange-Chatty ๋ฐ Manishearth์ ChatExchange ์ ๊ฐ์ ๊ธฐ์กด ๋ํ ๋ํผ ๋ฅผ๋ณด๊ณ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ณด๋ ๊ฒ์ด ์ ์ฉ ํฉ๋๋ค.
๋ต๋ณ
์๋ฐ ์คํฌ๋ฆฝํธ + jQuery, 1362 1258 ๋ฐ์ดํธ
์ถ์๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณจํ :
$(function(){function e(){function e(e,t){$("#input").val("@"+$(e).parents(".user-container").find(".username").eq(0).text()+" "+t),$("#sayit-button").click()}var i,a=$(t),s=a.map(function(e,t){return t.id}),r=s.slice(-1)[0]
n!=r&&(i=a.slice($.inArray(n,s)+1),n=r,i.map(function(t,n){var i,a,s,r,o,u,c,f=n.textContent.match(/!!(\S+)(?:\s+(\S+))?/)
if(f){switch(i=f[1],a=f[2],s="codegolf",0==i.indexOf("meta")&&(s="meta."+s,i=i.slice(4)),r="?site="+s,c=0,i){case"newest":o=["questions","&order=desc&sort=creation"],u=function(e){return e.items[0].title}
break
case"questioncount":o=["info",""],u=function(e){return e.items[0].total_questions}
break
case"tag":if(!a){c=1
break}o=["tags/"+a+"/wikis",""],u=function(e){return 0==e.items.length?"Tag not found":e.items[0].excerpt}
break
case"featured":o=0==s.indexOf("meta.")?["questions","&tagged=featured"]:["questions/featured",""],u=function(e){var t=e.items.length
return(e.items.has_more?"more than ":"")+t}}c?e(n,"You have not provided enough arguments"):o?$.get("http://api.stackexchange.com/2.2/"+o[0]+r+o[1],function(t){e(n,u(t))}):e(n,"The command "+i+" does not exist")}}))}var t="[id^=message-]",n=$(t).eq(-1).attr("id")
new MutationObserver(e).observe($("#chat").get(0),{childList:!0,subtree:!0})})
Stack Exchange์ jQuery ์๋์ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด์ผํฉ๋๋ค.
- http://chat.stackexchange.com/rooms/14697/chatbot-challenge-on-programming-puzzles-code-golf๋ฅผ ์ฝ๋ ๋ค .
- ์ฝ์์ ์ ์ฝ๋๋ฅผ ๋ถ์ฌ ๋ฃ๊ธฐ
- ์ฑํ ์ ๋ช ๊ฐ์ง ๋ช ๋ น์ ์ ๋ ฅํ์ญ์์ค
ํจ์ฌ ๋ ๊ณจํ๋ฅผ ์น ์๋ ์์ง๋ง ๊ท์ฐฎ๊ฒ ํ ์๋ ์์ต๋๋ค.
์ธ ๊ณจํ :
$(function() {
var sel = '[id^=message-]';
var latestMessage = $(sel).eq(-1).attr('id');
function update() {
var messages = $(sel);
var ids = messages.map(function(i, x) { return x.id; });
var newest = ids.slice(-1)[0];
if(latestMessage == newest) {
return;
}
var newMessages = messages.slice($.inArray(latestMessage, ids) + 1);
latestMessage = newest;
newMessages.map(function(i, x) {
var m = x.textContent.match(/!!(\S+)(?:\s+(\S+))?/);
if(!m) {
return;
}
var c = m[1];
var a = m[2];
var s = 'codegolf';
if(c.indexOf('meta') == 0) {
s = 'meta.' + s;
c = c.slice(4);
}
var site = '?site=' + s;
var url;
var extractor;
var too_few_args = 0;
switch(c) {
case 'newest':
var url = ['questions', '&order=desc&sort=creation'];
extractor = function(data) {
return data.items[0].title;
};
break;
case 'questioncount':
url = ['info', ''];
extractor = function(data) {
return data.items[0].total_questions;
};
break;
case 'tag':
if(!a) {
too_few_args = 1;
break;
}
url = ['tags/' + a + '/wikis', ''];
extractor = function(data) {
if(data.items.length == 0) {
return 'Tag not found';
}
return data.items[0].excerpt;
};
break;
case 'featured':
url = s.indexOf('meta.') == 0? ['questions', '&tagged=featured']: ['questions/featured', ''];
extractor = function(data) {
var l = data.items.length;
return (data.items.has_more? 'more than ': '') + l;
}
break;
}
if(too_few_args) {
write(x, 'You have not provided enough arguments');
} else if(!url) {
write(x, 'The command ' + c + ' does not exist');
} else {
$.get('http://api.stackexchange.com/2.2/' + url[0] + site + url[1], function(data) {
write(x, extractor(data));
});
}
});
function write(x, m) {
$('#input').val('@' + $(x).parents('.user-container').find('.username').eq(0).text() + ' ' + m);
$('#sayit-button').click();
}
}
new MutationObserver(update).observe($('#chat').get(0), {childList: true, subtree: true});
});