Unix

pidgin-nateon 에 커스텀 이모티콘 기능 넣기 - 1

ForceCore 2011. 2. 19. 00:21
파일전송 패치를 보낸이후 pidgin-nateon에 조금씩 패치를 하시는 분들의 git hub를 알게 되었다. 나도 저기 합세해봐야지 -_-ㅋㅋ;;

이 부분은 원작에도 아직 구현이 없는 부분이다.

(2011-02-18 22:53:50) <-- [ Chat ] {WHSP 0 ssss@nate.com|dpc_06805:5041|X0HA DPIMG REQUEST%091|0|7%09DPI07.ttl|5569|3:2147483647:736}
(2011-02-18 22:53:50) <-- [ Chat ] {WHSP 0 ssss@nate.com|dpc_06805:5041|X0HA AVCHAT2 OBJECT%090}
(2011-02-18 22:53:50) <-- [ Chat ] {WHSP 0 ssss@nate.com|dpc_06805:5041|X0HA FONT REQDATA%09굴림%09%099%090%090%09}
(2011-02-18 22:53:50) <-- [ Chat ] {WHSP 0 ssss@nate.com|dpc_06805:5041|X0HA MAIL REQUEST}
(2011-02-18 22:53:50) <-- [ Chat ] {MESG 0 ssss@nate.com MSG 굴림%090%09%09과거엔}
(2011-02-18 22:53:56) <-- [ Chat ] {MESG 0 ssss@nate.com TYPING 1}
(2011-02-18 22:53:59) <-- [ Chat ] {MESG 0 ssss@nate.com EMOTICON OBJECT%090000001%091%09NCE20110218225246.bmp%09+_+%092}
(2011-02-18 22:53:59) <-- [ Chat ] {MESG 0 ssss@nate.com MSG 굴림%090%09%09과거시험을%20봤대%20+_+}

이모티콘을 한 문장에 동시에 두개 이상 쓰는 경우.
(23:09:17) nateon: mesg_cmd - ssss@nate.com 1
(23:09:20) nateon: S: SB 001: MESG 0 ssss@nate.com EMOTICON OBJECT%090000001%092%09NCE20110218225246.bmp%09+_+%09NCE20110218225251.bmp%09;-%092

이모티콘문은 한번에 여러개가 합체되어 오는 것을 알 수 있다.

(23:09:20) nateon: mesg_cmd - ssss@nate.com OBJECT%090000001%092%09NCE20110218225246.bmp%09+_+%09NCE20110218225251.bmp%09;-%092
흐음. mesg_cmd에서 알아채고 뭔가 처리를 하려고 했지... 만 처리법을 모르겠지.

(23:09:20) nateon: S: SB 001: MESG 0 ssss@nate.com MSG 굴림%090%09%09+_+%20데힛%20뿌잉%20;-
(23:09:20) nateon: mesg_cmd - ssss@nate.com 굴림%090%09%09+_+%20데힛%20뿌잉%20;-

흐음. 그냥 개인적으로 많이 써서 넣는 것 뿐이다. -_-;;

매번 이모티콘이 들어갈 때 마다 저 MESG EMOTICON이 매번 간다. 그걸 어떻게 "수락"하는지는 미스테리하군 (아직). 이건 리눅스용 네이트온에조차 없다 -_-;; 패킷 훔쳐보기라도 써야 하나? 아니면 저걸 피진에서 윈도우용 네이트온으로 보내서 네이트온이 뭐라고 하는지 알아봐야겠다...

일단 커스텀 이모티콘을 추가하는 기능 자체가 안 보인다. 아마 콜백함수들이 설정되지 않아서 그럴테지. M$N 메신저에서 컨닝을 해야겠다.

여기에 보면 여러가지 함수가 있는데 그 중에서도
purple_conv_custom_smiley_add
이런 함수가 있다. 이 중심으로 뭔가 있을듯. 그리고 custom_smiley라는 단어가 들어간 함수 목록을 알 필요가 있다

msn 메신저 프로토콜이 현재 가장 만만한 샘플로 보임.

으음...
custom_smiley 가 들어간 것은 세 부분밖에 없다 -0-;;

아차차... msn 메신저 프로토콜에서 대문자로 SMILE, EMOTI 로 검색해보는걸 잊었다...!! 이런거야말로 flag값을 조절하는 상수들이기 때문에 네톤 프로토콜에서도 smiley를 사용할 수 있게 해줄 것이다. 근데 네톤에서 smiley를 자주들 쓰나??;; 개인적으로 많이 좋아하는 이모티콘 썩소 세트가 있어서 구현해보는건데 -_-...;;

PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY

이런 플래그를 M$N 메신저 프로토콜에서 찾았다. gc->flags 에 반영해주니까 일단 custom emoticon을 지원하는 프로토콜이란건 인식시킬 수 있었다. 그리고 M$N 메신저의 예처럼, 남의 이모티콘을 보고싶냐 안 보고 싶냐정도는 제어할 수 있도록 하는게 좋을 듯.

리눅스용 네톤에서 이모티콘을 만드는 기능은 없는데, 상대방이 커스텀 이모티콘을 쓴 이후, 자기도 그 것을, 보이진 않지만 타이핑 한게 커스텀 이모티콘이 되긴 한다는걸 발견했다 -_-;; 반쪽짜리 구현이라고 할 수 있겠군.

일단 커스텀 이모티콘이 목록엔 올랐다. 그리고 목록에 오른 것이 커스텀 이모티콘으로 보이긴 한다. (나한테만). 프로토콜로서 이게 커스텀 이모티콘이란걸 보내줘야 하겠다. 이 부분은 M$N 메신저를 컨닝...

msn_send_im_message
이게 보내는 메시지의 top level인 듯 하다.

피진네톤에선 top level이...
nateon_send_im
이거, 아마도?

M$N메신저의 코드를 컨닝해서 가져올 차례. 보낼 메시지를 스캔해서 이모티콘 목록을 뽑아내서, 이모티콘에 해당하는 것을 프로토콜에 얹어 보내면 됨.

어떻게 어떻게 Emoticon Object 어쩌구 어쩌구 하는 문장을 만드는 것은 했고 (msn_send_im_message를 컨닝하면 쉽다) 이제 이걸 보내야 하는데...

(19:09:24) nateon: C: SB 001: MESG 4 TYPING 0

타이핑 한다 안 한다를 보내는 코드를 컨닝하면 되겠군. 컨닝해서 메시지를 보내는 것도 성공했다.
보낸 말:
(19:48:15) nateon: C: SB 001: MESG 4 EMOTICON OBJECT%090000001%092%09ec785ae80a50a5e2d5aa7164043e0c17d2a96785.png%09헣%090e6ef82641976f9d4860f01b235bb653c66afcd0.png%09킄%092
(19:48:15) nateon: 0x242c790
(19:48:15) nateon: C: SB 001: MESG 5 MSG 굴림%09255%09%09헣%20킄
(19:48:15) nateon: 0x23956b0
(19:48:15) nateon: C: SB 001: MESG 6 TYPING 0
(19:48:15) nateon: S: SB 001: MESG 4
(19:48:15) nateon: S: SB 001: MESG 5

되걸어 오는 말:
(19:48:15) nateon: S: SB 001: WHSP 0 ssss@nate.com|dpc_06401:29694|X0HA EMOTICON REQUEST2%092%09헣%09킄%092
(19:48:15) nateon: [whsp_cmd]
(19:48:15) nateon: S: SB 001: MESG 6

저렇게 png로 된 걸 보내도 되는가... 그건 모르겠다. 하지만 일단 저게 피진에서 내부적으로 쓰는 파일명이니깐 그냥 쓰는 것일뿐. WHSP로 이모티콘을 달라는 요청을 한다. XOHA라... 저거엔 어떻게 반응해야 하지 ㅋㅋ;;... 그걸 모르겠으니깐, 이번에는 네톤에서 이모티콘 달라고 요청하면 어떤 반응을 보이는지 컨닝을 해야겠다.

이모티콘이 있나 감지하는 부분이 필요한데... M$N의 어디서 컨닝하지?
got_emoticon
얘랑 관련된 녀석들을 잘 찾아봐야겠다...

/**
 * Processes emoticon messages.
 *
 * @param cmdproc The command processor.
 * @param msg     The message.
 */
void msn_emoticon_msg(MsnCmdProc *cmdproc, MsnMessage *msg);
이모티콘이 있는 메시지를 처리 한다니 이것이 범인이 분명하다. 이걸 컨닝해서 내가 이모티콘을 쓴다는 메시지를 보내는데 성공했다.

(19:48:15) nateon: S: SB 001: WHSP 0 ssss@nate.com|dpc_06401:29694|X0HA EMOTICON REQUEST2%092%09헣%09킄%092
WHSP 0 ssss@nate.com|dpc_03805:12876|X0HA EMOTICON ACK2%091%09NCE20110218225251.bmp%091498%09;-%09
WHSP 0 ssss@nate.com|dpc_03805:12876|X0HA EMOTICON ACK2%092%09NCE20110218225301.bmp%091498%09:_%09NCE20110218225251.bmp%091498%09;-%09

이렇게 여러개의 ack을 한방에 받을 수 있음.

저 리퀘에는 이렇게 답하면 된다.
WHSP 4 ssss@nate.com EMOTICON ACK2%091%09ec785ae80a50a5e2d5aa7164043e0c17d2a96785.png%093815%09헣%09
그래서 이렇게 ACK을 보냈더니... (dpkey가 붙으면 안 되더군)

WHSP 0 ssss@nate.com|dpc_03805:12876|X0HA EMOTICON REQDATA%091%09헣%09
이런 답이 돌아온다.