Example #1
0
def cleaning_del(message, user_name, day_of_week):
    """指定した曜日の掃除当番からユーザーを削除する

    :param message: slackbot.dispatcher.Message
    :param str user_name: 掃除当番から削除するユーザー名
    :param str day_of_week: 削除する掃除当番が登録されている曜日
    """
    if day_of_week not in DAY_OF_WEEK:
        botsend(message, '曜日には `月` 、 `火` 、 `水` 、 `木` 、 `金` のいずれかを指定してください')
        return

    s = Session()
    slack_id = get_slack_id(s, user_name)
    if not slack_id:
        botsend(message, '{}はSlackのユーザーとして存在しません'.format(user_name))
        return

    cleaning_user = (s.query(Cleaning).filter(
        Cleaning.slack_id == slack_id).filter(
            Cleaning.day_of_week == DAY_OF_WEEK.index(
                day_of_week)).one_or_none())

    if cleaning_user:
        s.delete(cleaning_user)
        s.commit()
        botsend(message, '{}を{}曜日の掃除当番から削除しました'.format(user_name, day_of_week))
    else:
        botsend(message,
                '{}は{}曜日の掃除当番に登録されていません'.format(user_name, day_of_week))
Example #2
0
def cleaning_move(message, user_name, day_of_week):
    """登録された掃除当番のユーザーの掃除曜日を移動させる

    :param message: slackbot.dispatcher.Message
    :param str user_name: 掃除当番の曜日を移動させるユーザー名
    :param str day_of_week: 移動先の曜日名
    """
    if day_of_week not in DAY_OF_WEEK:
        botsend(message, '曜日には `月` 、 `火` 、 `水` 、 `木` 、 `金` のいずれかを指定してください')
        return

    s = Session()
    slack_id = get_slack_id(s, user_name)
    if slack_id is None:
        botsend(message, '{}はSlackのユーザーとして存在しません'.format(user_name))
        return

    cleaning_user = (s.query(Cleaning).filter(
        Cleaning.slack_id == slack_id).one_or_none())

    if not cleaning_user:
        botsend(message, '{}は掃除当番に登録されていません'.format(user_name))
        return

    cleaning_user.day_of_week = DAY_OF_WEEK.index(day_of_week)
    s.commit()
    botsend(message, '{}の掃除当番の曜日を{}曜日に変更しました'.format(user_name, day_of_week))
Example #3
0
def cleaning_add(message, user_name, day_of_week):
    """指定した曜日の掃除当番にユーザーを追加する

    :param message: slackbot.dispatcher.Message
    :param str user_name: 掃除当番に登録するユーザー名
    :param str day_of_week: 追加する掃除曜日
    """
    if day_of_week not in DAY_OF_WEEK:
        botsend(message, '曜日には `月` 、 `火` 、 `水` 、 `木` 、 `金` のいずれかを指定してください')
        return

    s = Session()
    slack_id = get_slack_id(s, user_name)
    if not slack_id:
        botsend(message, '{}はSlackのユーザーとして存在しません'.format(user_name))
        return

    q = s.query(Cleaning).filter(Cleaning.slack_id == slack_id)
    if s.query(q.exists()).scalar():
        botsend(message, '{}は既に登録されています'.format(user_name, day_of_week))
        return

    s.add(
        Cleaning(slack_id=slack_id,
                 day_of_week=DAY_OF_WEEK.index(day_of_week)))
    s.commit()
    botsend(message, '{}を{}曜日の掃除当番に登録しました'.format(user_name, day_of_week))
Example #4
0
def check_user_name(session, user_names):
    """Slackユーザー情報と照ら合わせ結果を辞書で返す

    :param list user_names: Slackで++対象のSlackユーザー名
    :return dict user_dict:
       keyが `matched`: Slackユーザーに紐付いた名前
       keyが `hint_name`: 紐付かなかったが、似た名前が存在する名前
       keyが `not_matched`: Slackユーザーに紐付かなかった名前
    """
    user_dict = {}
    for name in [x for x in user_names.split(' ') if x]:

        # slackのsuggest機能でユーザーを++した場合(例: @wan++)、name引数は
        # `<@{slack_id}>` というstr型で渡ってくるので対応
        if get_user_name(name.lstrip('<@').rstrip('>')):
            slack_id = name.lstrip('<@').rstrip('>')
        else:
            slack_id = get_slack_id(session, name)

        if slack_id:
            # slack_idに紐づくユーザーが存在
            user_dict.setdefault('matched', []).append((slack_id, name))
        else:
            # 一番近いユーザー名を算出
            hint = get_close_matches(name, get_users_info().values())
            if hint:
                user_dict.setdefault('hint_name', []).append(hint[0])
            # 紐づくユーザーが存在しなかった場合
            else:
                user_dict.setdefault('not_matched', []).append(name)
    return user_dict
Example #5
0
def show_thx_to(message, user_name=None):
    """誰にGJしたか表示します

    :param message: slackbot.dispatcher.Message
    :param str user_name:  GJしたユーザー名
    """
    channel_id = message.body['channel']
    if not user_name:
        user_name = get_user_name(message.body['user'])
    s = Session()
    slack_id = get_slack_id(s, user_name)
    if not slack_id:
        message.send('{}はSlackのユーザーとして存在しません'.format(user_name))
        return

    rows = [['GJされたユーザー', 'GJ内容']]
    thx = (s.query(ThxHistory).filter(
        ThxHistory.from_user_id == slack_id).filter(
            ThxHistory.channel_id == channel_id))
    for t in thx:
        rows.append([get_user_name(t.user_id), t.word])
    output = StringIO()
    w = csv.writer(output)
    w.writerows(rows)

    param = {
        'token': settings.API_TOKEN,
        'channels': channel_id,
        'title': '{}がGJした一覧'.format(user_name)
    }
    requests.post(settings.FILE_UPLOAD_URL,
                  params=param,
                  files={'file': output.getvalue()})
Example #6
0
def cleaning_swap(message, user_name1, user_name2):
    """登録された掃除当番のユーザーの掃除曜日を入れ替える

    :param message: slackbot.dispatcher.Message
    :param str user_name1: 掃除当番の曜日を交換するユーザー名
    :param str user_name2: 掃除当番の曜日を交換するユーザー名
    """

    s = Session()
    slack_id1 = get_slack_id(s, user_name1)
    slack_id2 = get_slack_id(s, user_name2)

    if slack_id1 is None:
        botsend(message, '{}はSlackのユーザーとして存在しません'.format(user_name1))
        return
    if slack_id2 is None:
        botsend(message, '{}はSlackのユーザーとして存在しません'.format(user_name2))
        return
    if slack_id1 == slack_id2:
        botsend(message, '{}と{}は同じSlackのユーザーです'.format(user_name1, user_name2))
        return

    cleaning_user1 = (s.query(Cleaning)
                      .filter(Cleaning.slack_id == slack_id1)
                      .one_or_none())
    cleaning_user2 = (s.query(Cleaning)
                      .filter(Cleaning.slack_id == slack_id2)
                      .one_or_none())

    if not cleaning_user1:
        botsend(message, '{}は掃除当番に登録されていません'.format(user_name1))
        return
    if not cleaning_user2:
        botsend(message, '{}は掃除当番に登録されていません'.format(user_name2))
        return

    cleaning_user1.slack_id = slack_id2
    cleaning_user2.slack_id = slack_id1
    s.commit()
    botsend(message, '{}と{}の掃除当番を交換しました'.format(user_name1, user_name2))
Example #7
0
def find_thx(s, text):
    """Slackに投稿されたメッセージからthxを見つけて返す

    :param s: sqlalchemy.orm.session.Session
    :param str text: ユーザーが投稿した内容
    :return Dict[str, List[Tuple[str, str]]] word_map_names_dict:
       キーがthx内容、バリューが対象Slackユーザーのリスト
    :return list hint_names: Slackユーザーに似た名前が存在する名前一覧
    :return list not_matched: Slackユーザーとして存在しなかった名前の一覧
    """
    word_map_names_dict = {}
    hint_names = []
    not_matched = []

    thx_matcher = re.compile(
        r'(?P<user_names>.+)[ \t\f\v]*(?<!\+)\+\+[ \t\f\v]+(?P<word>.+)',
        re.MULTILINE)
    for thx in thx_matcher.finditer(text):
        user_names = [x for x in thx.group('user_names').split(' ') if x]
        for name in user_names:
            if get_user_name(name.lstrip('<@').rstrip('>')):
                slack_id = name.lstrip('<@').rstrip('>')
            else:
                slack_id = get_slack_id(s, name)

            if slack_id:
                word_map_names_dict.setdefault(thx.group('word'), []).append(
                    (slack_id, name))
            else:
                # 一番近いユーザー名を算出
                names = [
                    profile['name'] for profile in get_users_info().values()
                ]
                hint = get_close_matches(name, names)
                if hint:
                    hint_names.append(hint[0])
                # 紐づくユーザーが存在しなかった場合
                else:
                    not_matched.append(name)

    return word_map_names_dict, hint_names, not_matched