Adium กับ groups.im(P4-Context)

หลังจากทนใช้ groups.im แบบไม่เห็นชื่อว่าใครพิมพ์มาอยู่นาน (เคยพยายามแก้ครั้งนึง แล้วงานเข้า เลยขี้เกียจขุดต่อ) วันนี้ @teerapapc หาทางแก้อีกครั้ง แล้วก็ได้ถึง stack trace ของ libpurple มา สุดท้ายเลยเอามาทำต่อเอง  แต่กว่าจะขุด Libpurple ออกมาได้เล่นซะเหนื่อย ตอนนี้ build binary ยัดไว้ที่ mirror เรียบร้อย ด้านล่างเป็นขั้นตอนการ build libpurple สำหรับ Adium ไม่สนใจก็ข้ามไปได้เลย เพราะจดเก็บไว้เผื่อต้อง build ใหม่ในอนาคต

เริ่มจากเอา Pidgin ออกมาตอนแรกคิดว่าง่ายเพราะหน้าดาวโหลดของ Pidgin มีให้ดาวโหลด source อยู่แล้ว ปรากฏว่าดาวโหลดมาเสร็จขาด autogen.sh ไป สุดท้ายต้อง checkout มาเอง(คือขี้เกียจหาวิธีเอา autogen.sh ออกมา)

  1. ติด monotone ก่อนเพื่อเอา source ของ Pidgin จาก repository
  2. ดาวโหลด monotone database ของ Pidgin มาจะเอาจากเว็บ Pidgin โดยตรง หรือจาก Mirror ก็ได้ดาวโหลดมาไว้แล้ว
  3. bzip2 -d pidgin.mtn.bz2 เพื่อขยายเอา database มันออกมา
  4. เอา source code ออกมาด้วยคำสั่งด้านล่าง
    mtn db -d pidgin.mtn migrate && mtn -d pidgin.mtn pull --set-default \
    mtn.pidgin.im "im.pidgin.*" && mtn -d pidgin.mtn co -b im.pidgin.adium.1-4 .;

ได้ code Pidgin มาแล้วต่อไปก็เตรียมของ Adium บ้าง

  1. เริ่มจาก clone source ของ Adium repository ก่อน
    hg clone http://hg.adium.im/adium
    
  2. โหลด dependency ทั้งหมดของ LibPurple

    $cd $ADIUM_SOURCE/Utilities/dep-build-scripts/common.sh -d
    

    จากนั้นก็รอยาว จนได้มาครบ

  3. แก้ไฟล์ common.sh โดยเพิ่ม PIDGIN_SOURCE ไปที่ pidgin.mtn ที่โหลดมาเมื่อครั้งแรกสุด

    PIDGIN_SOURCE=$SOURCE_DIRECTORY/Pidgin.mtn
    

    (หรือจะ export เป็น environment variable ก็ได้คิดว่าได้ผลเหมือนกัน)

  4. สั่ง make dependencies ทั้งหมดอีกรอบ

    $ ./general_dependencies_make.sh
    $ ./purple_dependencies_make.sh
    
  5. make libpurple แล้ว copy ให้ Adium

    $ ./purple_make.sh --i386
    $ ./universalize.sh
    $ ./copy_frameworks.sh
    

สั่ง build อีกรอบ ก็ได้ Adium + Libpurple ตัวล่าสุดโคตรๆ จาก Source Repository แล้ว

สำหรับปัญหาที่เกิดขึ้นคือ ใน MSN Groups แต่ละคนสามารถมีชื่อปลอมได้ โดย MSN Protocol จะกำหนดมาใน Attribute P4-Context แต่ว่า interface ที่ติดต่อระหว่าง Libpurple และ Adium ได้ตัด Attribute ออกทั้งหมด ตอนนี้เลยแก้ชั่วคราว​ โดยการเติมชื่อปลอมหน้าข้อความที่พิมพ์มาซะ

#
# old_revision [83e01106830ff1a309406ff0304c8dcec08aa725]
#
# patch "libpurple/protocols/msn/msg.c"
#  from [795b1a623db46112fd23481325996a6714691973]
#    to [7b43dd8ef3caf344d0862d3a3ab89d5e1a496758]
#
============================================================
--- libpurple/protocols/msn/msg.c	795b1a623db46112fd23481325996a6714691973
+++ libpurple/protocols/msn/msg.c	7b43dd8ef3caf344d0862d3a3ab89d5e1a496758
@@ -864,6 +864,10 @@ msn_plain_msg(MsnCmdProc *cmdproc, MsnMe
 		body_final = body_enc;
 	}

+  if ((value = msn_message_get_attr(msg, "P4-Context")) != NULL) {
+    body_final = g_strdup_printf("%s: %s", value, body_final);
+  }
+
 	if (cmdproc->servconn->type == MSN_SERVCONN_SB) {
 		MsnSwitchBoard *swboard = cmdproc->data;

จริงๆ ปัญหานี้อยู่ใน Trac ของ Pidgin แล้ว(เมื่อสองปีที่แล้ว) แต่ดูจากการแก้ไขแล้วตอบโต้ไปมาก็ไม่รู้จะแก้ไขเมื่อไหร่ เลยต้องทำแก้ขัดไปก่อน จะแก้ไปใน Pidgin ชั่วคราวด้วยก็ยังได้ (เพียงแต่ว่าขี้เกียจหา dependencies อีกเลยทำแต่ของ Adium) ก็หวังว่า Pidgin จะปิด Ticket นี้ได้เร็ววัน เพราะจากที่แก้ดูไปแล้วก็ไม่ค่อยสวยงามเท่าไหร่

Link ที่เกี่ยวข้อง

  1. Pidgin Trac: MSN group name display support
  2. MSN-Pecan patch
  3. Using Monotone for Pidgin

About llun

Just a programmer

, , ,

  • }-{orse

    แก้ไงฟะมีบั๊กด้วย !!! :p

  • http://www.aruj.org อรุช

    เป็นอะไรที่คนอย่างผมเข้าไม่ถึงจริงๆ ครับ คารวะ 5 กระป๋อง

  • http://www.teerapap.net teerapap

    เยี่ยม! ขอบคุณคร้าบบ