কখনও কখনও বছরিক ইভেন্টের জন্য রিমাইন্ডার তৈরি করা সেরা যাতে আপনি সেই 스페شل তারিখগুলো ভুলে যাবেন না।
যদি আপনি এবং আপনার টিম/বন্ধুরা Slack ব্যবহার করেন, তবে এই রিমাইন্ডারগুলো স্ল্যাকবটের মাধ্যমে অটোমেট করা একটি ভালো আইডিয়া।
এটি করার সময়, আপনি আপনার স্ল্যাকবটকে লো-মেইনটেন্যান্স করতে চাইলে যাতে এটি কনকারেন্ট ইন্টারঅ্যাকশন হ্যান্ডেল করতে পারে সোর্সের সাথে, হরিজন্টাল স্কেলেবিলিটিও সক্ষম করে, সার্ভারলেস টেকনোলজি ব্যবহার করা সেরা হতে পারে।
আমরা কী তৈরি করছি
আমরা Python, AWS Chalice, AWS Lambda এবং API Gateway ব্যবহার করে একটি ইভেন্ট রিমাইন্ডার স্ল্যাকবট তৈরি করব। এটি ব্যবহারকারীদের সক্ষম করবে:
- ব্যবহারকারীদের জন্য জন্মদিন সেট করা।
- ব্যবহারকারীদের জন্য বর্ষগাঁठ সেট করা।
- ব্যবহারকারী বা সাধারণ চ্যানেলের জন্য কাস্টম ইভেন্ট সেট করা।
ইভেন্টগুলো সেট হয়ে গেলে:
- লোকেদের স্মরণ করাবে যে একটি নির্দিষ্ট ইভেন্ট আসছে, ইভেন্টের কেন্দ্রে যে ব্যক্তি আছে (ইভেন্ট সেট করার সময় যাকে মেনশন করা হয়েছিল) 그를 ছাড়া।
- ইভেন্টের বার্ষিকী আসলে সাধারণ চ্যানেলে পোস্ট করবে, ইভেন্টের কেন্দ্রে যেই ব্যক্তি আছে (অথবা চ্যানেলের সবাই) তাকে মেনশন করে।
কমান্ড
set
/event set birthday <YYYY-MM-DD> <user>ব্যবহারকারীর জন্মদিন সেট করে।

/event set anniversary <YYYY-MM-DD> <user>ব্যবহারকারীর জন্য বর্ষগাঁঠ সেট করে, যখন তারা কাজে যোগ দিয়েছিল।

/event set custom <YYYY-MM-DD> <user> <whitespace সহ যেকোনো মেসেজ>প্রদত্ত মেসেজ ব্যবহার করে একটি কাস্টম রিমাইন্ডার সেট করে।

get-all
/event get-all:সেট করা সব ইভেন্ট দেখায়।

/event get-all birthday:সেট করা সব জন্মদিন দেখায়।

/event get-all anniversary:সেট করা সব বর্ষগাঁঠ দেখায়।

/event get-all custom:সেট করা সব কাস্টম ইভেন্ট দেখায়।

get
/event get birthday <user>:ব্যবহারকারীর জন্মদিনের ডিটেইলস দেখায়।

/event get anniversary <user>:ব্যবহারকারীর বর্ষগাঁঠের ডিটেইলস দেখায়, যখন তারা কাজে যোগ দিয়েছিল।

/event get custom <event_name>(get-all দিয়ে পাওয়া যায়):প্রদত্ত মেসেজ ব্যবহার করে কাস্টম ইভেন্টের ডিটেইলস দেখায়।

remove
/event remove birthday <user>:ব্যবহারকারীর জন্মদিন রিমুভ করে।

/event remove anniversary <user>:ব্যবহারকারীর বর্ষগাঁঠ রিমুভ করে, যখন তারা কাজে যোগ দিয়েছিল।

/event remove custom <event_name>(get-all দিয়ে পাওয়া যায়):প্রদত্ত মেসেজ ব্যবহার করে কাস্টম ইভেন্ট রিমুভ করে।

শিডিউলড রিমাইন্ডার
সাধারণ চ্যানেলকে রিমাইন্ড করুন
সময় আসলে, স্ল্যাকবট নির্দিষ্ট চ্যানেলে রিমাইন্ডার মেসেজ পাঠাবে।

বট থেকে প্রাইভেট মেসেজ
সময় নিকটে, স্ল্যাকবট প্রাইভেট রিমাইন্ডার মেসেজ পাঠাবে।

তাই, এই টুলটি টিম সদস্যদের স্পেশাল তারিখ ট্র্যাক করার জন্য ব্যবহার করা যেতে পারে। এইভাবে, সম্পর্ক এবং ইন্টার-কমিউনিকেশন একটি সুস্থ উপায়ে বজায় রাখা যায়।
শুরু করুন
ডাটাবেস প্রস্তুত করুন
আমরা Upstash Console-এ আমাদের Redis ডাটাবেস তৈরি করতে পারি। UPSTASH_REDIS_REST_URL এবং UPSTASH_REDIS_REST_TOKEN নোট করুন যেহেতু এগুলো AWS-এর জন্য এনভায়রনমেন্ট ভেরিয়েবল হবে।
AWS ক্রেডেনশিয়াল কনফিগার করা
(Official Chalice Repo-র থেকে নেওয়া। আরও তথ্যের জন্য সেখানে রেফার করুন।)
$ mkdir ~/.aws $ cat >> ~/.aws/config [default] aws_access_key_id=YOUR_ACCESS_KEY_HERE aws_secret_access_key=YOUR_SECRET_ACCESS_KEY region=YOUR_REGION (such as us-west-2, us-west-1, etc)
কিছু কনভেনশন
- সকল
.pyফাইলapp.pyবাদেchalicelibডিরেক্টরির অধীনে রাখা উচিত, অন্যথায় ইম্পোর্ট স্টেটমেন্ট সমস্যা সৃষ্টি করতে পারে। - সকল এনভায়রনমেন্ট ভেরিয়েবল
.chaliceডিরেক্টরির ভিতরেconfig.jsonফাইলে কনফিগার করা উচিত।- JSON ফরম্যাটে, key: "environment_variables" দিয়ে।
প্রজেক্ট সোর্স ডেভেলপমেন্ট
সবচেয়ে প্রথমে, যেহেতু আমরা
AWS Chaliceব্যবহার করছি, chalice ইনস্টল করতে:pip install chalice
Chalice প্রজেক্ট ইনিশিয়েট করুন
chalice new-project <project_name>
তারপর প্রজেক্ট ফোল্ডারে cd করুন। প্রজেক্টটি ইতিমধ্যে একটি টেমপ্লেট নিয়ে আসে।
রান করুন: chalice local প্রজেক্টটি কাজ করছে কিনা দেখতে।
app.py
সমগ্র প্রজেক্ট স্ট্রাকচার এবং Slack রিকোয়েস্ট হ্যান্ডেল করার জন্য মূল ফাইল।
এটির সাথে, আমরা আমাদের প্রজেক্ট স্ট্রাকচার এবং এন্ডপয়েন্ট তৈরি করি। আমরা সিদ্ধান্ত নিই ইভেন্টগুলো কীভাবে হ্যান্ডেল করব, রিমাইন্ডারের জন্য কী শিডিউল করব।
from chalice import Chalice, Cron, Rate import os import random from datetime import date from chalicelib.utils import responseToDict, postToChannel, diffWithTodayFromString, allSlackUsers, sendDm, validateRequest, convertToCorrectMention from chalicelib.upstash import setHandler, getAllHandler, getEvent, getAllKeys, removeEvent app = Chalice(app_name='birthday-slackbot') NOTIFY_TIME_LIMIT = int(os.getenv("NOTIFY_TIME_LIMIT")) # GET রিকোয়েস্টের জন্য স্যাম্পল রুট। @app.route('/', methods=["GET"]) def something(): return { "Hello": "World" } # POST রিকোয়েস্ট এন্ডপয়েন্ট কনফিগার করা। # কমান্ড পার্স করা হয় এবং হ্যান্ডলারকে ডিরেক্ট করা হয় @app.route('/', methods=["POST"], content_types=["application/x-www-form-urlencoded"]) def index(): # বডি পার্স করা হয় ইজ অফ ইউজের জন্য r = responseToDict(app.current_request.raw_body) headers = app.current_request.headers # রিকোয়েস্টের বৈধতা চেক করা। if not validateRequest(headers, r): return {"Status": "Validation failed."} commandArray = r['text'].split() command = commandArray.pop(0) try: if command == "set": setHandler(commandArray) return { 'response_type': "ephemeral", 'text': "Set the event." } elif command == "get": eventType = commandArray[0] eventName = eventType + "-" + commandArray[1] resultDict = getEvent(eventName) return { 'response_type': "ephemeral", 'text': "`{}` Details:\n\n Date: {}\nRemaining: {} days!".format(eventName, resultDict[0], resultDict[1]) } elif command == "get-all": stringResult = getAllHandler(commandArray) return { 'response_type': "ephemeral", 'text': "{}".format(stringResult) } elif command == "remove": eventName = "{}-{}".format(commandArray[0], commandArray[1]) removeEvent(eventName) return { 'response_type': "ephemeral", 'text': "Removed the event." } else: return { 'response_type': "ephemeral", 'text': "Wrong usage of the command." } except: print("some stuff") return { 'response_type': "ephemeral", 'text': "Some problem occured. Please check your command." } # প্রতিদিন ১০:০০ AM (UTC) রান করুন। @app.schedule(Cron(0, 10, '*', '*', '?', '*')) def periodicCheck(event): allKeys = getAllKeys() for key in allKeys: handleEvent(key) # জেনেরিক ইভেন্ট পার্স করা হয় এবং প্রাসঙ্গিক হ্যান্ডলারদের ডিরেক্ট করা হয়। def handleEvent(eventName): eventSplitted = eventName.split('-') eventType = eventSplitted[0] // @ বা ! প্রথম ক্যারেক্টার হিসেবে ডিসকার্ড করুন personName = eventSplitted[1][1:] personMention = convertToCorrectMention(personName) eventDict = getEvent(eventName) remainingDays = eventDict[1] totalTime = eventDict[2] if eventType == "birthday": birthdayHandler(personMention, personName, remainingDays) elif eventType == "anniversary": anniversaryHandler(personMention, personName, remainingDays, totalTime) elif eventType == "custom": eventMessage = "Not specified" if len(eventSplitted) == 3: eventMessage = eventSplitted[2] customHandler(eventMessage, personMention, personName, remainingDays) # জন্মদিন ইভেন্ট হ্যান্ডেল করে। def birthdayHandler(personMention, personName, remainingDays): if remainingDays == 0: sendRandomBirthdayToChannel('general', personMention) if remainingDays <= NOTIFY_TIME_LIMIT: dmEveryoneExcept("{} day(s) until {}'s birthday!".format(remainingDays, personMention), personName) # বর্ষগাঁঠ ইভেন্ট হ্যান্ডেল করে। def anniversaryHandler(personMention, personName, remainingDays, totalTime): if remainingDays == 0: sendRandomAnniversaryToChannel('general', personMention, totalTime) if remainingDays <= NOTIFY_TIME_LIMIT: dmEveryoneExcept("{} day(s) until {}'s anniversary! It will be {} year(s) since they joined!".format(remainingDays, personMention, totalTime), personName) # কাস্টম ইভেন্ট হ্যান্ডেল করে। def customHandler(eventMessage, personMention, personName, remainingDays): if remainingDays == 0: postToChannel('general', "`{}` is here {}!".format(eventMessage, personMention)) elif remainingDays <= NOTIFY_TIME_LIMIT: dmEveryoneExcept("{} day(s) until {} `{}`!".format(remainingDays, personMention, eventMessage), personName) // নির্দিষ্ট ব্যক্তি ছাড়া সবাইকে প্রাইভেট মেসেজ পাঠায়। def dmEveryoneExcept(message, person): usersAndIds = allSlackUsers() for user in usersAndIds: if user[0] != person: sendDm(user[1], message) // নির্দিষ্ট চ্যানেলে র্যান্ডমলি বেছে নেওয়া জন্মদিন মেসেজ পাঠায়। def sendRandomBirthdayToChannel(channel, personMention): messageList = [ "Happy Birthday {}! Wishing you the best!".format(personMention), "Happy Birthday {}! Wishing you a happy age!".format(personMention), "Happy Birthday {}! Wishing you a healthy, happy life!".format(personMention), ] message = random.choice(messageList) return postToChannel('general', message) // নির্দিষ্ট চ্যানেলে র্যান্ডমলি বেছে নেওয়া বর্ষগাঁঠ মেসেজ পাঠায়। def sendRandomAnniversaryToChannel(channel, personMention, totalTime): messageList = [ "Today is the anniversary of {} joining! It has been {} years since they joined!".format(personMention, totalTime - 1), "Celebrating the anniversary of {} joining! It has been {} years!".format(personMention, totalTime - 1), "Congratulating {} for entering {}(th) year here!".format(personMention, totalTime), ] message = random.choice(messageList) return postToChannel('general', message) // আমরা চাই প্রজেক্ট ডিপ্লয়/রি-ডিপ্লয় হলে আমাদের ইভেন্ট হ্যান্ডলারগুলো চলে। allKeys = getAllKeys() for key in allKeys: handleEvent(key)
chalicelib/utils.py
হেল্পার ফাংশন এবং অ্যাবস্ট্রাকশনের জন্য মূল ফাইল।
আমরা প্রধানত এই ফাইলটি অ্যাবস্ট্রাকশনের জন্য ব্যবহার করব। যাতে আমাদের সোর্স কোড ক্লাটার্ড না হয় এবং পঠনযোগ্যতা বজায় থাকে।
from urllib import request import urllib from urllib.parse import parse_qsl import json import os import hmac import hashlib from datetime import date SLACK_BOT_TOKEN = os.getenv("SLACK_BOT_TOKEN") SLACK_SIGNING_SECRET = os.getenv("SLACK_SIGNING_SECRET") // Slack ব্যবহারকারীর রিয়েল নাম রিটার্ন করে। def getRealName(slackUsers, username): for user in slackUsers: if user[0] == username: return user[2] return "Nameless" // ওয়ার্কস্পেসের সব Slack ব্যবহারকারী রিটার্ন করে। def allSlackUsers(): resultDict = sendPostRequest("https://slack.com/api/users.list", SLACK_BOT_TOKEN) members = resultDict['members'] userMembers = [] for member in members: if not member['deleted'] and not member['is_bot']: userMembers.append([member['name'], member['id'], member['real_name']]) return userMembers // দেওয়া চ্যানেলের আইডি রিটার্ন করে। def channelNameToId(channelName) : resultDict = sendPostRequest("https://slack.com/api/conversations.list", SLACK_BOT_TOKEN) for channel in resultDict['channels']: if (channel['name'] == channelName): return channel['id'] return None // দেওয়া চ্যানেল আইডিতে দেওয়া মেসেজ দিয়ে পোস্ট করে। def postToSlack(channelId, messageText): data = { "channel": channelId, "text": messageText } data = json.dumps(data) data = str(data) data = data.encode('utf-8') resultDict = sendPostRequest("https://slack.com/api/chat.postMessage", SLACK_BOT_TOKEN, data) return resultDict // একটি Slack চ্যানেলে পোস্ট করে। def postToChannel(channel, messageText): channelId = channelNameToId(channel) return postToSlack(channelId, messageText) // userId সহ একজন ব্যবহারকারীর কাছে প্রাইভেট মেসেজ পাঠায়। def sendDm(userId, messageText): return postToSlack(userId, messageText) // জেনেরিক POST রিকোয়েস্ট পাঠায় এবং রেজাল্ট রিটার্ন করে। def sendPostRequest(requestURL, bearerToken, data={}): req = request.Request(requestURL, method="POST", data=data) req.add_header("Authorization", "Bearer {}".format(bearerToken)) req.add_header("Content-Type", "application/json; charset=utf-8") r = request.urlopen(req) resultDict = json.loads(r.read().decode()) return resultDict // রেসপন্স পার্স করে ডিক্টে কনভার্ট করে। def responseToDict(res): return dict(parse_qsl(res.decode())) // তারিখ দেওয়া হয়: YYYY-MM-DD // বর্তমান দিন এবং বর্ষগাঁঠের পার্থক্য রিটার্ন করে। def diffWithTodayFromString(dateString): now = date.today() currentYear = now.year dateTokens = dateString.split("-") month = int(dateTokens[1]) day = int(dateTokens[2]) if now > date(currentYear, month, day): return (date((currentYear + 1), month, day) - now).days return (date(currentYear, month, day) - now).days // তারিখ দেওয়া হয়: YYYY-MM-DD // বর্তমান তারিখ পর্যন্ত মোট কত সময় পার হয়েছে ক্যালকুলেট করে। def totalTimefromString(dateString): now = date.today() dateTokens = dateString.split("-") year = int(dateTokens[0]) month = int(dateTokens[1]) day = int(dateTokens[2]) then = date(year, month, day) years = now.year - then.year return years + 1 // এন্ডপয়েন্টে আসা রিকোয়েস্ট ভ্যালিডেট করে। // টাইমস্ট্যাম্প এবং সাইনিং সিক্রেট দিয়ে রিকোয়েস্ট বডি হ্যাশ করে। // তারপর সেই হ্যাশটি Slack সিগনেচারের সাথে তুলনা করে। def validateRequest(header, body): bodyAsString = urllib.parse.urlencode(body) timestamp = header['x-slack-request-timestamp'] slackSignature = header['x-slack-signature'] baseString = "v0:{}:{}".format(timestamp, bodyAsString) h = hmac.new(SLACK_SIGNING_SECRET.encode(), baseString.encode(), hashlib.sha256) hashResult = h.hexdigest() mySignature = "v0=" + hashResult return mySignature == slackSignature // দেওয়া নামকে মেনশন স্ট্রিং-এ কনভার্ট করে। def convertToCorrectMention(name): if name == "channel" or name == "here" or name == "everyone": return "".format(name) else: return "<@{}>".format(name)
chalicelib/upstash.py
ডাটাবেসের সাথে সরাসরি সম্পর্কিত ফাংশনগুলির জন্য মূল ফাইল।
এখানে, আমরা আমাদের ডাটাবেস কল হ্যান্ডেল করব। আমরা ডাটাবেস থেকে ফেচ করব, কী-ভ্যালু পেয়ার সেট করব ইত্যাদি। এই ফাইলটি
app.pyথেকে লো-লেভেল ডিটেইলস অ্যাবস্ট্রাক্ট করতে সাহায্য করে, পঠনযোগ্যতা এবং মডুলারিটি বাড়াতে।
Upstash Redis ডাটাবেসের একটি চমৎকার বিষয় হলো এটি RESTFUL API কল সমর্থন করে। এইভাবে, আপনি কানেকশন liên tục তৈরি এবং বন্ধ করার প্রয়োজন ছাড়াই আপনার ডাটাবেস অ্যাক্সেস করতে পারেন, যা সার্ভারলেস অ্যাপ্লিকেশনগুলির জন্য আদর্শ পথ।
from chalicelib.utils import sendPostRequest, getRealName, allSlackUsers, diffWithTodayFromString, totalTimefromString import os UPSTASH_REST_URL = os.getenv("UPSTASH_REST_URL") UPSTASH_TOKEN = os.getenv("UPSTASH_TOKEN") // দেওয়া প্যারামিটারসহ Upstash Rest Url-এ পোস্ট করে। def postToUpstash(parameters): requestURL = UPSTASH_REST_URL for parameter in parameters: requestURL += ("/" + parameter) resultDict = sendPostRequest(requestURL, UPSTASH_TOKEN) return resultDict['result'] // দেওয়া প্যারামিটার দিয়ে ইভেন্টের জন্য কী-ভ্যালু পেয়ার সেট করে। def setEvent(parameterArray): postQueryParameters = ['SET'] for parameter in parameterArray: parameter = parameter.split() for subparameter in parameter: postQueryParameters.append(subparameter) resultDict = postToUpstash(postQueryParameters) return resultDict // দেওয়া ইভেন্ট থেকে ইভেন্ট ডিটেইলস রিটার্ন করে। def getEvent(eventName): postQueryParameters = ['GET', eventName] date = postToUpstash(postQueryParameters) timeDiff = diffWithTodayFromString(date) totalTime = totalTimefromString(date) mergedDict = [date, timeDiff, totalTime] return mergedDict // ডাটাবেস থেকে সব কী (ইভেন্ট) ফেচ করে def getAllKeys(): return postToUpstash(['KEYS', '*']) // ডাটাবেস থেকে দেওয়া ইভেন্ট ডিলিট করে। def removeEvent(eventName): postQueryParameters = ['DEL', eventName] resultDict = postToUpstash(postQueryParameters) return resultDict // সেট রিকোয়েস্ট হ্যান্ডেল করে পার্সিং এবং setEvent ফাংশন প্যারামিটার কনফিগার করে। def setHandler(commandArray): eventType = commandArray.pop(0) date = commandArray.pop(0) user = commandArray.pop(0) if eventType == "birthday": listName = "birthday-" + user return setEvent( [listName, date] ) elif eventType == "anniversary": listName = "anniversary-" + user return setEvent( [listName, date] ) elif eventType == "custom": message = "" for string in commandArray: message += string + "_" listName = "custom-" + user + "-" + message user = commandArray[1] return setEvent( [listName, date] ) else: return // get-all রিকোয়েস্ট হ্যান্ডেল করে। def getAllHandler(commandArray): filterParameter = None if len(commandArray) == 1: filterParameter = commandArray[0] allKeys = getAllKeys() birthdays = [] anniversaries = [] customs = [] slackUsers = allSlackUsers() stringResult = "\n" for key in allKeys: if key[0] == 'b': birthdays.append(key) elif key[0] == 'a': anniversaries.append(key) elif key[0] == 'c': customs.append(key) if filterParameter is None or filterParameter == "birthday": stringResult += "Birthdays:\n" for bday in birthdays: tag = bday.split('-')[1] username = tag[1:] realName = getRealName(slackUsers, username) details = getEvent(bday) stringResult += "`{}` ({}): {} - `{} days` remaining!\n".format(tag, realName, details[0], details[1]) if filterParameter is None or filterParameter == "anniversary": stringResult += "\nAnniversaries:\n" for ann in anniversaries: tag = ann.split('-')[1] username = tag[1:] realName = getRealName(slackUsers, username) details = getEvent(ann) stringResult += "`{}` ({}): {} - `{} days` remaining!\n".format(tag, realName, details[0], details[1]) if filterParameter is None or filterParameter == "custom": stringResult += "\nCustom Reminders:\n" for cstm in customs: splitted = cstm.split('-') username = splitted[2] realName = getRealName(slackUsers, username) details = getEvent(cstm) stringResult += "`{}-{}` ({}): {}\n".format(splitted[1], splitted[2], getRealName(slackUsers, username), details[0]) return stringResult
.chalice/config.json
AWS-এ প্রজেক্ট কনফিগারেশনের জন্য ফাইল।
এখানে, আমরা প্রজেক্ট ডিটেইলস যেমন এনভায়রনমেন্ট ভেরিয়েবল এবং ডিপ্লয়মেন্ট স্টেজ ডিফাইন করি। এর জন্য, আমরা শুধু এনভায়রনমেন্ট ভেরিয়েবল কনফিগার করব:
{ "environment_variables": { "UPSTASH_REST_URL": , "UPSTASH_TOKEN": , "SLACK_BOT_TOKEN": , "SLACK_SIGNING_SECRET": , "NOTIFY_TIME_LIMIT": "" } }
সব শেষ হয়ে গেলে
ফোল্ডার স্ট্রাকচার
আপনার ফোল্ডার স্ট্রাকচার এরকম দেখতে উচিত:
: app.py chalicelib: utils.py upstash.py .chalice: config.json
লোকালি রান করা
Chalice লোকাল ডিপ্লয়মেন্ট সক্ষম করে, যা ডেভেলপমেন্ট প্রসেসকে খুব দ্রুত করে।
রান করুন: chalice local 
যদি আপনার স্ট্যাটিক IP ঠিকানা না থাকে, তবে আপনাকে ngrok এর মতো একটি টানেলিং সার্ভিস ব্যবহার করতে হবে যাতে আপনি আপনার এন্ডপয়েন্ট Slack-এ দেখাতে পারেন:
./ngrok http 8000--> আপনার localhost:8000 টানেল করে
Slack কনফিগার করুন
১. Slack API Apps Page-এ যান:
- নতুন App তৈরি করুন
- From Scratch
- আপনার অ্যাপের নাম দিন এবং একটি ওয়ার্কস্পেস বেছে নিন
- Oauth & Permissions-এ যান
- নিচের স্কোপগুলো যোগ করুন
- channels:read
- chat:write
- chat:write.public
- commands
- groups:read
- users:read
- App को वर्कस्पेस में इंस्टॉल करें
- Basic Information --> Install Your App --> Install To Workspace
- নিচের স্কোপগুলো যোগ করুন
- ভেরিয়েবলগুলো নোট করুন (এগুলো AWS ডিপ্লয়মেন্টের জন্য এনভায়রনমেন্ট ভেরিয়েবল হবে) :
SLACK_SIGNING_SECRET:- Basic Information-এ যান
- App Credentials --> Signing Secret
- Basic Information-এ যান
SLACK_BOT_TOKEN:- OAuth & Permissions-এ যান
- Bot User OAuth Token
- OAuth & Permissions-এ যান
৩. Slack API Apps Page-এ যান এবং প্রাসঙ্গিক অ্যাপ বেছে নিন:
ডিপ্লয়মেন্টের পর, আপনি REST_API_URL বা ngrok_domain <domain> হিসেবে ব্যবহার করতে পারেন।
- Slack API Apps Page-এ যান এবং প্রাসঙ্গিক অ্যাপ বেছে নিন:
- Slash Commands-এ যান:
- Create New Command:
- Command :
event - Request URL :
<domain> - বাকি কনফিগার আপনার পছন্দ মতো করুন।
- Command :
- Create New Command:
- এই পরিবর্তনগুলোর পরে, Slack অ্যাপটি রি-ইনস্টল করতে বলতে পারে।
অভিনন্দন!
আপনার কাছে এখন একটি ফাংশনিং সার্ভারলেস Slackbot আছে! আপনার পছন্দ মতো কাস্টমাইজ করতে পারেন।
লোকাল হোস্টিং এবং রেজাল্টস سے সন্তুষ্ট হলে, সিম্পলি:
chalice deployAWS Lambda এবং API Gateway-এ ফাইনাল ডিপ্লয়মেন্টের জন্য।
আপনি এখন AWS Chalice-র প্রদত্ত REST_API_URL আপনার Slack কনফিগারেশনে ব্যবহার করতে পারেন।
