ด้วยบอทฉันจะหลีกเลี่ยงหรือจัดการ MOTD ของเซิร์ฟเวอร์ IRC ได้อย่างไร


1

ฉันมีบอต IRC เขียนใน Python ที่ทำงานได้ค่อนข้างดี ฉันคิดว่าปัญหานี้เกิดจากความรู้ที่ จำกัด ของโปรโตคอล IRC ดังนั้นฉันยินดีต้อนรับผู้เชี่ยวชาญด้าน IRC โดยเฉพาะที่นี่: D

เมื่อคุณเชื่อมต่อกับเครือข่าย IRC เป็นครั้งแรก MOTD มักจะปรากฏขึ้น เครือข่ายจะไม่ยอมรับคำสั่งใด ๆ จนกว่า MOTD จะเสร็จสิ้น ดังนั้นด้วยบอทของฉันฉันต้องมีลูปที่ตรวจสอบจุดสิ้นสุดของ MOTD นี่ไม่ใช่มอดูลาร์โดยเฉพาะอย่างยิ่งเนื่องจากในประสบการณ์ของฉันเซิร์ฟเวอร์ไม่ทั้งหมดจบ MOTD ของพวกเขาในลักษณะเดียวกัน มีวิธีบอกเซิร์ฟเวอร์ไม่ให้ส่ง MOTD หรือเป็นวิธีที่ดีกว่าในการรอให้ MOTD สิ้นสุดเพื่อบอกเซิร์ฟเวอร์ว่าฉันต้องการเชื่อมต่อกับช่องใด

รหัสปัจจุบันของฉันที่รอการสิ้นสุดของ MOTD ประกอบด้วยการวนรอบในขณะที่อ่านบัฟเฟอร์อินพุตและแยกแต่ละคำสั่งทั้งหมดลงในรายการ ใช้รายการนี้และค้นหาแต่ละวัตถุสตริงเพื่อหาสตริงที่ปรากฏในตอนท้ายของ MOTD ของ FreeNode หากพบลูปจะสิ้นสุดลงและคำสั่งเพื่อเข้าร่วมแชนเนลจะถูกส่งก่อนเข้าสู่ลูปหลัก

มีวิธีที่ดีกว่าในการจัดการ MOTD หรือไม่? ฉันอดไม่ได้ที่จะรู้สึกว่าวิธีนี้ค่อนข้างซุ่มซ่าม


ฉันไม่รู้จัก python หรือ IRC แต่ฉันคิดว่าคุณจะรอประมาณ 10 วินาทีก่อนที่มันจะเริ่มทำงาน
Jon

1
คุณไม่ต้องรอให้ MOTD เสร็จสิ้นเพื่อเริ่มส่งคำสั่ง คุณจะได้รับผลลัพธ์ในภายหลัง
BatchyX

@ chipperyman573 ฉันคิดอย่างนั้น แต่มันทำให้ฉันผิดวิธีที่ต้องพึ่งพาตัวจับเวลาสำหรับการรับรองความถูกต้อง ในใจของฉันมันสามารถทำให้เกิดปัญหาได้มากเท่าที่เกี่ยวกับ modularity เช่นเดียวกับการตั้งค่าปัจจุบันของฉัน
LiamMeron

คำตอบ:


2

มีวิธีบอกเซิร์ฟเวอร์ไม่ให้ส่ง MOTD หรือเป็นวิธีที่ดีกว่าในการรอให้ MOTD สิ้นสุดเพื่อบอกเซิร์ฟเวอร์ว่าฉันต้องการเชื่อมต่อกับช่องใด

ไม่ไม่มีวิธีใดที่จะปิด MOTD อย่างไรก็ตามมันก็ไม่จำเป็นด้วยซ้ำเพราะข้อสันนิษฐานของคุณที่ว่า "เครือข่ายจะไม่ยอมรับคำสั่งใด ๆ จนกว่า MOTD จะเสร็จสิ้น" ไม่เป็นความจริงในตอนแรก

เครือข่ายทั้งหมดเริ่มยอมรับคำสั่งทันทีที่คุณลงทะเบียน (เช่นส่งNICKและUSER) - บางส่วนของพวกเขาเพียงล่าช้าในการทำตามคำสั่งเหล่านั้นโดยที่สองหรือสอง มันถูกต้องสมบูรณ์ในการเริ่มส่งคำสั่งโดยเร็วที่สุด


ไม่ว่าในกรณีใดคุณไม่จำเป็นต้องหน่วงเวลาการวนรอบหลักเพื่อให้บรรลุผล - แน่นอนการป้อนข้อมูลที่ได้รับทั้งหมดควรได้รับการจัดการโดยการวนซ้ำเดียวกัน แต่คุณเพียงแค่ติดตามว่าคุณได้เห็นบรรทัด "end of MOTD" แล้วและส่งJOINs ในครั้งแรกที่คุณเห็น

นอกจากนี้จากคำอธิบายของคุณดูเหมือนว่าคุณกำลังใช้วิธีที่ไม่น่าเชื่อถือในการตรวจสอบจุดสิ้นสุดของ MOTD หากคุณกำลังมองหาสตริง "สิ้นสุด / MOTD" - อย่า แต่ให้แยกบรรทัดทั้งหมดตามที่ระบุในRFC 1459 § 2.3.1 (นี่คือparserแบบไม่เฉพาะเจาะจง - Pythonic ) และตรวจสอบคำสั่งในแต่ละบรรทัดเนื่องจากข้อความอธิบายอาจแตกต่างกันระหว่าง IRC daemons ที่แตกต่างกัน คุณควรตรวจสอบข้อความ "no / MOTD"

ตัวอย่างเช่นคุณจะมี:

# raw input is ":leguin.freenode.net 376 grawity :End of /MOTD.\r\n"
# split input is [":leguin.freenode.net", "376", "grawity", "End of /MOTD."]
# parsed input is {"prefix":  "leguin.freenode.net",
#                  "command": "376",
#                  "args":    ["grawity", "End of /MOTD."]}

RPL_WELCOME   = "001"
RPL_ENDOFMOTD = "376"
ERR_NOMOTD    = "422"

if not sent_initial_join:
    if command in {RPL_WELCOME, RPL_ENDOFMOTD, ERR_NOMOTD}:
        conn.send("JOIN %s\r\n" % ",".join(channels))
        sent_initial_join = True

แต่ดังที่ได้กล่าวมาแล้วสิ่งนี้ไม่จำเป็น เพียงแค่ส่งJOINทันทีหลังจากที่NICK, และสิ่งที่ต้องการUSERCAP END

และโดยพระเจ้าที่ไม่ได้ใช้สิ่งที่เป็นโง่หมดเวลา 10 วินาทีนี้


ขอบคุณ. คำสั่งเกี่ยวกับเครือข่ายที่ไม่ยอมรับคำสั่งการเข้าร่วมช่องก่อนที่จะสิ้นสุด MOTD นั้นขึ้นอยู่กับประสบการณ์ของฉันเมื่อเขียนบอทนี้ ฉันไม่สามารถรับมันเพื่อเข้าร่วมช่องยกเว้นฉันรอให้เซิร์ฟเวอร์พูดจบ ฉันรู้ว่าการตั้งค่าปัจจุบันของฉันแย่แค่ไหนซึ่งเป็นสาเหตุที่ฉันกำลังมองหาวิธีที่ดีกว่าในการจัดการกับมัน ในทำนองเดียวกันฉันตระหนักถึงข้อบกพร่องของการหมดเวลา 10 วินาที ขอบคุณสำหรับลิงค์ที่จะช่วยให้ฉันทำบอทพกพามากขึ้น: D
LiamMeron

@ LiamMeron นั่นอาจเป็นเพราะบั๊กใน bot ของคุณเช่นสมมติว่าข้อความใดข้อความหนึ่งต้องตอบกลับคำสั่งเฉพาะ
David Schwartz

เซิร์ฟเวอร์ฟรีโนดมีการกำหนดค่าที่จะชะลอการตอบสนองจน 1-2 วินาทีหลังจาก MOTD แต่พวกเขาไม่เสมอส่งคำตอบนั้น ฉันได้ทดสอบสิ่งนี้แล้ว
grawity

ใช่แล้วคุณพูดถูก! ฉันเพิ่งเขียนส่วนที่จำเป็นของรหัสอีกครั้งเพื่อไปข้างหน้าและส่งคำสั่งเข้าร่วมและใช้งานได้ ฉันไม่ทราบว่าข้อผิดพลาดคืออะไร แต่ฉันเดาว่าความจริงที่ว่าตอนนี้ใช้งานได้จะทำให้คำถามของฉันดูถูก อย่างไรก็ตามฉันยังคงเรียนรู้บางสิ่งบางอย่างดังนั้นตามที่เพื่อนบอกว่า "เวลาไม่เคยสูญเปล่าตราบใดที่บางสิ่งได้เรียนรู้" ขอบคุณ!
LiamMeron

บางคำตอบบอกว่าเราต้องรอและคนอื่น ๆ เช่นคุณบอกว่าเราไม่ได้
freeforall tousez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.