2014-02-18 1 views
0

처리 중 개별 IRC 메시지에서 IRC를 읽고 데이터를 가져 오려고합니다. 당신은 코드를 볼 수 있고 (트위터 라이브러리와 함께, 그것을 무시하십시오), 저는 닉의 형식으로 데이터를 끌어낼 수있는 방법에 대한 몇 가지 지침이 필요합니다 : 메시지 그래서 그것은 시각화에 표시 될 수 있습니다.처리 중 IRC 데이터를 올바르게 읽음

//Twitter 

    import twitter4j.conf.*; 
    import twitter4j.*; 
    import twitter4j.auth.*; 
    import twitter4j.api.*; 
    import java.util.*; 



// Import the net libraries 
import processing.net.*; 

// Declare a client 
Client client; 


Twitter twitter; 
String searchString = "god"; 
List<Status> tweets; 

String server = "irc.twitch.tv"; 
String nick = "NugShow"; 
//String user = "simple_bot"; 
int port = 6667; 
String channel = "#nugshow"; 
String password = "xx"; 

String in = "butt"; 
String checkFor; 

//bools 
Boolean isLive = false; 


    int privMsgIndex; 
    int atIndex; 
    String playerSubstring; 



// The channel which the bot will joString channel = "#irchacks"; 

int currentTweet; 

void setup() 
{ 
    size(800,600); 
    frameRate(60); 

    ConfigurationBuilder cb = new ConfigurationBuilder(); 
    cb.setOAuthConsumerKey("xx"); 
    cb.setOAuthConsumerSecret("xx"); 
    cb.setOAuthAccessToken("xx"); 
    cb.setOAuthAccessTokenSecret("xx"); 

    TwitterFactory tf = new TwitterFactory(cb.build()); 

    twitter = tf.getInstance(); 

    getNewTweets(); 

    currentTweet = 0; 

    thread("refreshTweets"); 
    thread("loopChat"); 
    connectToServer(); 



    //IRC 
} 

void draw() 
{ 
    if (client.available() > 0) { 
    String in = client.readString(); 
    println(in); 

    } 
    if (isLive == false){ 
    if (client.available() > 0) { 


     } 
    } else { 

    } 

    /* 
    fill(0, 40); 
    rect(0, 0, width, height); 

    currentTweet = currentTweet + 1; 

    if (currentTweet >= tweets.size()) 
    { 
     currentTweet = 0; 
    } 

    Status status = tweets.get(currentTweet); 

    fill(200); 
    text(status.getText(), random(width), random(height), 300, 200); 

    delay(100); 

    */ 
} 

void joinChannel() { 
    String in = client.readString(); 
    client.write("JOIN " + channel + "\n\r"); 
    client.clear(); 
    in = client.readString(); 
    println(in); 
    if (in != null){ 
    //println("Recieved data"); 
    println(in); 
    //String inString = myClient.readStringUntil(""); 

    isLive = true; 
    println(isLive); 

    } 
} 

void connectToServer() 
{ 
    client = new Client(this, server , 6667); 
    client.write("PASS " + password + "\n\r"); 
    println(password + " sent!"); 
    client.write("NICK " + nick + "\n\r"); 
    println(nick + " sent!"); 
    joinChannel(); 
} 


void getNewTweets() 
{ 
    try 
    { 
     Query query = new Query(searchString); 

     QueryResult result = twitter.search(query); 

     tweets = result.getTweets(); 
    } 
    catch (TwitterException te) 
    { 
     System.out.println("Failed to search tweets: " + te.getMessage()); 
     System.exit(-1); 
    } 
} 



void refreshTweets() 
{ 
    while (true) 
    { 
     getNewTweets(); 

     println("Updated Tweets"); 

     delay(30000); 
    } 
} 

void loopChat() 
{ 
    while (true) 
    { 

     if (privMsgIndex != 0){ 

     println(privMsgIndex); 
     //privMsgIndex = privMsgIndex - 15; 
     atIndex = in.indexOf("@"); 
     println(atIndex); 
     //atIndex = atIndex + 1; 
     playerSubstring = in.substring(atIndex, privMsgIndex); 
     println(playerSubstring); 
     } else { 
     println("looped"); 
     } 



     delay(300); 
     client.clear(); 
     in = null; 
    } 
} 

void keyPressed() 
{ 

} 


void tweet() 
{ 
    try 
    { 
     Status status = twitter.updateStatus("This is a tweet sent from Processing!"); 
     System.out.println("Status updated to [" + status.getText() + "]."); 
    } 
    catch (TwitterException te) 
    { 
     System.out.println("Error: "+ te.getMessage()); 
    } 
} 

채팅 명령어는 다음과 같다 : nugshow 사용자 이름은 :[email protected] PRIVMSG #nugshow :dddd는 #nugshow 채널이며, DDDD는 메시지입니다. 나는 그것을 nugshow : dddd 형식으로 가져와야합니다. 나뿐만 아니라 client.recieved 버퍼에서 제거하는 방법을 잘 모르겠어요 헤더 많은 정보가

, 그것은 다음과 같습니다

:testserver.local 001 nugshow :Welcome, GLHF! 
:testserver.local 002 nugshow :Your host is testserver.local 

:testserver.local 003 nugshow :This server is rather new 
:testserver.local 004 nugshow :- 
:testserver.local 375 nugshow :- 
:testserver.local 372 nugshow :You are in a maze of twisty passages, all alike. 
:testserver.local 376 nugshow :> 

:[email protected] JOIN #nugshow 
:nugshow.testserver.local 353 nugshow = #nugshow :nugshow 
:nugshow.testserver.local 366 nugshow #nugshow :End of /NAMES list 

:[email protected] PRIVMSG nugshow :HISTORYEND nugshow 
+0

함께 작업하는 데이터의 샘플을 게시하십시오 –

+0

원하는 형식으로 데이터를 가져오고 싶거나 어쩌면 이유가 무엇인지와 같이 '중요한 부분을 표시하십시오'면 좋을까요? 그게 당신에게 (아직) 불가능하고'입력과 당신의 출력물의 예'가 가장 좋을 것입니다. 응답에 대한 –

+0

덕분에, 채팅 명령어는 다음과 같다 : : nugshow [email protected] PRIVMSG #nugshow! nugshow 사용자 이름이 이 #nugshow 채널이며, DDDD는 메시지입니다 DDDD. nugshow 형식으로 가져와야합니다. dddd –

답변

1

내가 여기에 정규식을 추천하지 않을 것입니다. 적어도 모든 유형의 IRC 메시지를 포착 할 수 있기를 원하는 경우는 아닙니다. 핵심은 메시지 코드를보고 실제로 메시지에서 벗어날 수있는 내용을 파악하는 것입니다. 나는 또한 IRC 클라이언트 (낄낄 거리는 소리)를 쓰고 있기 때문에 몇 가지 메모가 있습니다.

킥오프되지 않도록 서버에서 보내는 PING에 답해야합니다. PING이 식별자와 함께 전송되므로이를 포착하여 다시 보내야합니다. 이를 수행하는 간단한 방법은 서버에서 보낸 마지막 줄을 확인하고 그 줄 문자열을 부분 문자열로 검사하는 것입니다.

String line = inputStream.readLine(); 
if(line.substring(0,4).equals("PING")){ 
    send("PONG " + line.substring(5)); // Assume you have some send-function. 
} 

이렇게하면 시작하지 않고 실제로 서버에 머무를 수 있습니다.

앞에서 언급했듯이 RegEx-of-Doom이 될 것이므로 regex를 사용하지 않는 것이 좋습니다. 그래서, 내가 한 것은 당신이 얻은 라인을 분할하고 모든 결과를 문자열 배열에 넣는 것입니다.

String[] arr = line.split(" "); 

게시 한 메시지 줄에서 알 수 있듯이 IRC 프로토콜은 내용을 공백으로 구분합니다. 그래서 공간이 아닌 모든 것을 초라하게 (우리는 실제 텍스트를 다루는 방법을 알아낼 것입니다). 메시지에서 항상 (내가 말할 수있는 한) 기본 구조는 PREFIX COMMAND PARAM PARAM/TRAILING입니다. 그렇다면이게 무슨 뜻입니까? PREFIX는 메시지를 보낸 곳입니다. 예 : "user! [email protected]". COMMAND는 실제로 행이 무엇인지를 나타냅니다. 당신은 여기 PRIVMSG를 찾고 있지만, 당신이 돌볼 수있는 많은 것들이 많이 있습니다. JOIN, PART, QUIT, 332 (현재 주제), 353 (채널 닉스, 채널로 보낼 수 없음) 등과 같이 PARAM 및 PARAM/TRAILING은 모두 COMMAND에 의존합니다.

So ? 우리는이 공간에서 분할에서 무엇을 얻을 않습니다.

arr[0] = :[email protected] 
arr[1] = COMMAND 
arr[2] = PARAM 
arr[3 onwards] = rest 

우리는 이제 쉽게 자신의 필요한 방법으로 모든 명령을 관리 할 수 ​​있습니다

을 지체없이하는 것은, 실제 문제는 PRIVMSG에 도착 할 수 있습니다. 다음 문자열을 사용합니다. ": Chewtoy! [email protected] PRIVMSG # Stackoverflow : Ty : 질문을보고 대답을 주어야한다고 생각했습니다." 공간에서 분할을 수행 한 후, 우리는 3에서 배열

arr[0] = :[email protected] 
arr[1] = PRIVMSG 
arr[2] = #stackoverflow 
arr[3] = :Ty: 
arr[4] = I 
arr[5] = saw 
... 

당신이 볼 수 있듯이, 모든 것을 얻을하고 이후 원하는 메시지입니다. 0-2는 누가 어디에 무엇을 보냈는지 알 수 있어야하는 물건입니다.이 모든 것을 얻는 코드는 다음과 같습니다.

String[] arr = receivedLine.split(" "); 
if(arr[1].equals("PRIVMSG")){ 
    String[] usr = arr[0].split(!"); // Get the user, which is in usr[0]. Host in usr[1] 
    StringBuilder msg = new StringBuilder(); 
    for(int i=3; i<arr.length; i++){ // We know the message starts at arr[3], so start counting from that. 
     msg.append(arr[i] + " "); 
    } 

    String chan = ""; 
    if(arr[2].substring(0,1).equals("#")){ // We need to differentiate between sending to channel and sending a PM. The only difference in this is where the text is sent. 
     chan = arr[2]; 
    } else{ 
     chan = usr[0].substring(1); // substring(1) because we want Chewtoy, not :Chewtoy 
    } 

    // The result here will be: 
    // <#stackoverflow> Chewtoy: Ty: I saw your question and thought I should give you an answer. 
    sendItAllToWhereYouWantIt("<" + chan +"> " + usr[0].substring(1) + ": " + msg.substring(1)); 
} 

희망이 있습니다.