สั่ง Slackbot ให้เป็น HR ประจำทีม

Trust Tanapruk
Nextzy
Published in
3 min readFeb 26, 2019
ใช้ slack API + Cloud Functions

Nextzy ใช้ slack มาหลายปี เรียกว่าใช้ตั้งแต่บริษัทเริ่มเปิดใหม่ๆ เลยด้วยซ้ำ ใช้แบบ free plan มาตลอด แต่ติดปัญหาย้อนดูข้อความเก่าๆ ไม่ได้ ลิมิตที่ 10,000 ข้อความ คงเพราะมีปริมาณพนักงานที่มากขึ้น

ถึงจุดนึงข้อความ 5 วันที่แล้วก็ดูไม่ได้ !!!

ต้องหาทางเลือกอื่นแว้ว

จึงลองทั้ง Google Hangout, Stride, RocketChat และอีกมากมาย พบว่า ไม่มีใครทำดีเท่า slack เจ้าอื่นขาดโน่น ขาดนี่ ทำให้ต้องยอมกลับมาจ่ายตังที่ Slack Standard plan

นอกจากดูย้อนหลังเท่าไหร่ก็ได้แล้ว ก็ใส่ App เท่าไหร่ก็ได้อีก !! ผมก็เลยถือโอกาสแงะ document Slack API และเขียน slash command คู่กับ firebase cloud functions เพื่อทำหน้าที่ HR

ปัญหา

ชาว Nextzy จะส่งเรื่องขอลา ก็จะพิมพ์บอกในห้อง #calendar กัน และกรอกในเว็บไซต์ระบบ HR

มันมีปัญหาในแง่ บางวันน้องหายไป ไม่มาทำงาน หรือบางคนจำไม่ได้ว่าน้องลาวันไหน ก็ต้อง scroll กลับไปหา chat เก่าๆ ว่าน้องได้ขอลาไว้นะ ไม่ได้เป็นอะไรไป

น้องพอล ขอลาวันที่ 13

มันก็เป็นเรื่องเล็กน้อยแหละ แค่เลื่อนขึ้นย้อนกลับไปนิดหน่อย เพื่อหาว่าใครลา แต่ เมื่อทำบ่อยๆ วันละ 10 วิ หลายวัน หลายคน ก็เสีย manday ของ programmer ไปนะ สู้เอาเวลาไปเล่นเกมดีก่า (หยอกๆ)

อยากได้

  • slackbot เตือนทุกเช้า วันนี้มีใครลาบ้าง

เครื่องมือ

Http Server

slack API ต้องการ http endpoint ไว้โต้ตอบแหละ ซึ่งปกติ ต้องหา backend มาทำ แต่ผมไม่อยากเสียตังเช่า server

หวยเลยไปตกที่ serverless solution อย่าง cloud functions

ซึ่ง setup ง่ายมาก มีแค่ไฟล์ .js 1 ไฟล์​ ก็ได้ http เอาไว้รับ request ได้เลย

module.exports.pathName = functions.https.onRequest(async (request, response) => {response.send('ok')})

endpoint ที่ต้องทำ

  • action ไว้รับ command line /offwork, และรับปุ่ม กด submit
  • event ไว้ดูข้อความใน calendar

ที่เก็บข้อมูลลา

ข้อมูลลาที่จะใช้เตือนในวันข้างหน้า ก็ต้องถูกเก็บไว้ที่ไหนที่หนึ่ง จะใช้ mongo ก็เปลือง server อีก ไหนๆใช้ 🔥 cloud functions แล้ว ข้อมูลลาก็เก็บใน 🔥 Firestore เลย สะดวกดี

Scheduler ไว้สั่งให้ slackbot ทำงาน

ถ้าเป็น linux server เราจะตั้ง cronjob เพื่อ ยิง curl ได้ แต่เมื่อเราใช้ serverless อย่าง cloud function มันไม่มี โปรแกรมนี้ ผมเลยทำ reminder ใน channel #calendar และ ให้ endpoint นึงของ cloud functions คอยดักข้อความทั้งหมด และ filter หา keyword whooffworks ถ้าเจอก็ เตือนเข้า #calendar เลย

ผลลัพธ์

ทุกเช้าตอน 9:09 ตัวระบบ slack จะ remindว่า whooffworks ซึ่งยิงเข้า event ข้อความ และไป query Firestore ดูรายชื่อคนลาในวันนี้ และหยิบมา postMessage ใส่ #calendar

bot แจ้งเตือนตอนเช้า

ก่อนจะมีฝั่งแสดงผล ก็ต้องมีฝั่ง Input ซึ่งผมทำผ่านคำสั่ง /offwork เมื่อพิมพ์ /offwork จะ trigger ไปหา endpoint ให้สร้าง dialog กับคนพิมพ์ จากนั้น เมื่อกด Submit ก็จะเก็บข้อมูลเข้า Firestore และ Bot ก็จะ postMessage ให้กับห้อง #calendar

ชีวิตง่ายขึ้นแยะ ผมสามารถประหยัดเวลาทีมขึ้นมาอีกนิดนึง 🌟 🌟 🌟

FYI ข้อจำกัด cloud functions

เนื่องจากความเป็น serverless เมื่อไม่ใช้นานๆ มันจะหลับ และตื่นเมื่อมีการเรียกครั้งถัดไป ซึ่งการตื่นจากหลับใหล (cold boot) มี delay อยู่ เฉลี่ย 6 วินาทีได้

มันก็ไม่ได้เยอะมาก แต่ Slack งอแงง่าย ถ้าตอบช้ากว่า 3 วิ จะเด้ง error ให้กด retry ละ

แก้โดยทำ event ยิงปลุกมันเรื่อยๆ ทุก 15 นาที ก็ยังไม่ perfect ยังมีหลับกลางอากาศ แต่ก็ดีกว่าไม่ยิง

--

--