SlackのBotによるチャンネル管理を容易にするライブラリを３日で作った

ぶっちゃけ車輪の再発明寄り。車輪を木製からゴム製に変えました。

# 概要
学内のチーム実習において、SlackのBotを用いた制作物の作成を企画しており、それに対する操作が意外と煩雑で、使い回しが多かったため、インスタンスにチャンネルIDや招待するユーザーのリストを保持させて、簡単にチャンネルを作成し、チャンネル名のフォーマットを整えつつ管理を楽にするためのライブラリを公開しました。


![instanceSlackBot4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692998/afec5ac4-52f6-e9b5-abf5-ed2bece542f4.gif)

https://github.com/Dai-H15/InstanceSlackBot

## 内容
Djangoを用いたアプリケーションを作成する際に、ある条件下でSlackにチャンネルを作成し、ユーザーを招待、最初の投稿をボットが行うという動作が発生しました。
 
その際、複数のユーザーを招待したり、複数のチャンネルを作成したりする際にチャンネルIDの管理が煩雑になり、混乱の元となったわけでした。
 
今回作成したライブラリでは、インスタンス内にチャンネルID、投稿したいメッセージ、招待するユーザーの一覧などを保持し、関数を実行するのみで操作が行えることから、投稿を複数行う場合や、スケジュールされた投稿等などにおけるコードのコピペを減らし、ハードルを下げたいということと型を定義することで間違いを減らしたいという目的を持っています

## 使用例

**インストール**
```pip install instanceSlackBot ```

### 使用方法 
```py:howToUse.py
from instanceSlackBot import SlackBotSet

instance2 = SlackBotSet(api_token=SLACK_API_TOKEN)
instance2.add_user_id_list_by_email(mailaddr="s***********@iniad.org")
instance2.edit_channel_name(name="学内ボランティア")

message = ChannelDesc()

message.title = "学内ボランティア"
message.create_date = datetime.datetime.now().strftime("%Y-%m-%d")
message.start_date = (
    datetime.datetime.now() + datetime.timedelta(days=3)).strftime("%Y-%m-%d")
message.how = "対面"
message.desc = """
学内ボランティアで交流を深めましょう！
"""
instance2.set_message(message.get_init_message())
channel_id = instance2.create_channel()
instance2.invite_users()
instance2.post_bot_message_by_instance()

message.set_custom_message("こんにちは。２回目のポストです。テストです。")
instance2.set_message(message.get_custom_message())
instance2.post_bot_message_by_channel_id(channel_id)

time = datetime.datetime.now() + datetime.timedelta(seconds=20)
message.set_custom_message(f"こんにちは。３回目のポストです。{time} に送信されます。")
instance2.set_message(message.get_custom_message())
instance2.post_bot_schedule_message_by_instance(time)


time = datetime.datetime.now() + datetime.timedelta(seconds=30)
message.set_custom_message(f"こんにちは。４回目のポストです。{time} に{channel_id}へ送信されます。")
instance2.set_message(message.get_custom_message())

instance2.post_bot_schedule_message_by_channel_id(channel_id=channel_id, time=time)

```

ここで書いているChannelDescというクラスは、あくまでもチーム内での決まり事に使用するためで作成・使用したもので、直接str型のmessageを渡しても動きます

```py
class ChannelDesc:
    class MessageIsEmpty(Exception):
        def __str__(self) -> str:
            return "メッセージがセットされていません。"
    """
    チャンネル管理用のクラス

    必要な項目
        title: タイトル
        create_date: 企画立案日
        start_date: 開催日時
        how: 開催形態
        desc: 詳細
        message: メッセージ置き場
    """
    def __init__(self):
        self.title = ""
        self.create_date = ""
        self.start_date = ""
        self.how = ""
        self.desc = ""
        self._custom_message = ""

    def get_init_message(self) -> str:
        message = f"""
おいでやす。イベントにご参加いただきありがとうございます。
今回参加いただくイベントの詳細は以下の様になっております。
_```
企画名: {self.title}
立案日: {self.create_date}
開催日: {self.start_date}
開催形態: {self.how}
詳細: {self.desc}```
以上でございます。イベントの主役は皆さんです。イベントを成功させるべく皆さんで頑張りましょう。

>参加にあたってのご案内
このチャンネルについて
_```
・ このチャンネルは、イベントに賛同された方々が集まっています。互いを尊重し、誹謗中傷などは行わないようにしましょう。
・ 開催日以前では、参加者同士で自己紹介を行いましょう。
・ 開催日までに、都合の良い時間などをすり合わせ、タイミングを調節してください。
・ 開催形態は、女将が提案したものであり、参加者同士の話し合いにより変更いただいても構いません。
・ イベント開催期間は、基本1ヶ月となっております。```

ご不明点などは、INIADスイッチにてお問い合わせください。
それでは、まずは自己紹介から行いましょう
まずは私から
_```
名前: イベント女将
住まい: ひみつ
好きな食べ物: 和菓子
休日の過ごし方・趣味: お花の稽古
ひとこと: 隠れ家カフェが好き
よろしくお願いいたします```
"""
        return message

    def set_custom_message(self, message: str):
        self._custom_message = message

    def get_custom_message(self):
        if self._custom_message.strip() == "":
            raise self.MessageIsEmpty
        return self._custom_message

```
余分なアンダースコアはQiitaでの表示崩れを無くすためのものです。

インスタンス内のチャンネルIDを使用しても、チャンネルIDを指定しても動くようになっています。
これでだいぶ間違いが減らせたのと、必要な引数を減らせたので楽に使用できるようになりました

## 最後に
なんでこれを作ったかって言うとぶっちゃけ自己満足が７割です。
たくさん褒めていただけると伸びるタイプです

というのもありますが、PyPlを用いたパッケージの公開を勉強したり、JSでライブラリを作成したりしていたことをPythonに落とし込むとどんな便利が生まれるのか試してみたかったというのもあります。

まだまだ開発を続けていきます🦾
使用していただけると一番嬉しいですし、コメントや反応をいただけるともっと嬉しいです。
最後までお読みいただきありがとうございました。