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))
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))
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))
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
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()})
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))
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