<commit_before>from slackbot.bot import respond_to
from slackbot import settings
from slacker import Slacker
from googleapiclient.errors import HttpError

from .google_api import get_service

DOMAIN = 'pycon.jp'

# https://developers.google.com/admin-sdk/directory/v1/reference/?hl=ja
# https://developers.google.com/resources/api-libraries/documentation/admin/directory_v1/python/latest/index.html

HELP = '''
- `$gadmin user list`: ユーザーの一覧を返す

- `$gadmin group list`: グループの一覧を返す
- `$gadmin group insert (group) (name)`: 指定したグループを追加する
- `$gadmin group delete (group)`: 指定したグループを削除する

- `$gadmin member list (group)`: 指定したグループのメンバー一覧を返す
- `$gadmin member insert (group) (email...)`: 指定したグループにメンバーを追加する
- `$gadmin member delete (group) (email...)`: 指定したグループからメンバーを削除する
'''


def _get_service():
    """
    Google Apps Admin SDK の Directory API に接続する
    """
    service = get_service('admin', 'directory_v1')
    return service


def _is_admin(user):
    """
    ユーザーがSlackのAdminかどうかを返す

    :param user: SlackのユーザーID
    """
    slack = Slacker(settings.API_TOKEN)
    user_info = slack.users.info(user)
    return user_info.body['user']['is_admin']


def _remove_email_link(email):
    """
    slack の email 記法 <mailto:<EMAIL>|<EMAIL>> を
    メールアドレスのみに戻す
    """

    email = email.replace('<mailto:', '')
    if '|' in email:
        email, _ = email.split('|', 2)
    return email


@respond_to('^gadmin\s+user\s+list')
def gadmin_user_list(message):
    """
    ユーザーの一覧を返す
    """

    service = _get_service()
    users_list = service.users().list(orderBy='email', domain=DOMAIN).execute()

    count = 0
    msg = ''
    for user in users_list.get('users', []):
        email = user['primaryEmail']
        fullname = user['name']['fullName']
        msg += '- {} {}\n'.format(email, fullname)
        count += 1
    msg = '{}ドメインのユーザー一覧({}ユーザー)\n'.format(DOMAIN, count) + msg
    message.send(msg)


@respond_to('^gadmin\s+group\s+list')
def gadmin_group_list(message):
    """
    グループの一覧を返す
    """<commit_msg>ISSHA-397 add gadmin alias command<commit_after>from slackbot.bot import respond_to
from slackbot import settings
from slacker import Slacker
from googleapiclient.errors import HttpError

from .google_api import get_service

DOMAIN = 'pycon.jp'

# https://developers.google.com/admin-sdk/directory/v1/reference/?hl=ja
# https://developers.google.com/resources/api-libraries/documentation/admin/directory_v1/python/latest/index.html

HELP = '''
- `$gadmin user list`: ユーザーの一覧を返す

- `$gadmin alias list (email)`: ユーザーのエイリアスの一覧を返す
- `$gadmin alias insert (email) (alias)`: ユーザーにエイリアスを追加する
- `$gadmin alias delete (email) (alias)`: ユーザーからエイリアスを削除する

- `$gadmin group list`: グループの一覧を返す
- `$gadmin group insert (group) (name)`: 指定したグループを追加する
- `$gadmin group delete (group)`: 指定したグループを削除する

- `$gadmin member list (group)`: 指定したグループのメンバー一覧を返す
- `$gadmin member insert (group) (email...)`: 指定したグループにメンバーを追加する
- `$gadmin member delete (group) (email...)`: 指定したグループからメンバーを削除する
'''


def _get_service():
    """
    Google Apps Admin SDK の Directory API に接続する
    """
    service = get_service('admin', 'directory_v1')
    return service


def _is_admin(user):
    """
    ユーザーがSlackのAdminかどうかを返す

    :param user: SlackのユーザーID
    """
    slack = Slacker(settings.API_TOKEN)
    user_info = slack.users.info(user)
    return user_info.body['user']['is_admin']


def _remove_email_link(email):
    """
    slack の email 記法 <mailto:<EMAIL>|<EMAIL>> を
    メールアドレスのみに戻す
    """

    email = email.replace('<mailto:', '')
    if '|' in email:
        email, _ = email.split('|', 2)
    return email


@respond_to('^gadmin\s+user\s+list')
def gadmin_user_list(message):
    """
    ユーザーの一覧を返す
    """

    service = _get_service()
    users_list = service.users().list(orderBy='email', domain=DOMAIN).execute()

    count = 0
    msg = ''
    for user in users_list.get('users', []):
        email = user['primaryEmail']
        fullname = user['name']['fullName']
        msg += '- {} {}\n'.format(email, fullname)
        count += 1
    msg = '{}ドメインのユーザー一覧({}ユーザー)\n'.format(DOMAIN, count) + msg
    message.send(msg)


@respond_to('^gadmin\s+alias\s+list\s+(.*)')
def gadmin_alias_list(message, email):
    """
    指定したユーザーのエイリアスの一覧を返す

    :param email: メールアドレス
    """

    service = _get_service()
    email = _remove_email_link(email)
    if '@' not in email:
        email += '@' + DOMAIN
    try:
        result = service.users().aliases().list(userKey=email).execute()
        msg = ''
        aliases = result.get('aliases', [])
        if aliases:
            msg = '`{}` のエイリアス一覧\n'.format(email)
            msg += ', '.join('`{}`'.format(alias['alias']) for alias in aliases)
            message.send(msg)
        else:
            msg = '`{}` のエイリアスはありません'.format(email)
            message.send(msg)
    except HttpError as e:
        message.send('エイリアスの取得失敗しました\n`{}`'.format(e))


def _gadmin_alias_insert(service, message, email, alias):
    """
    指定したユーザーにエイリアスを追加する

    :param service: Google API との接続
    :param email: 追加対象のメールアドレス
    :param alias: エイリアスのメールアドレス
    """
    body = {
        'alias': alias,
    }
    try:
        service.users().aliases().insert(userKey=email, body=body).execute()
        message.send('`{}` にエイリアス `{}` を追加しました'.format(email, alias))
    except HttpError as e:
        message.send('エイリアスの追加に失敗しました\n`{}`'.format(e))


def _gadmin_alias_delete(service, message, email, alias):
    """
    指定したユーザーからエイリアスを削除する

    :param service: Google API との接続
    :param email: 追加対象のメールアドレス
    :param alias: エイリアスのメールアドレス
    """
    try:
        service.users().aliases().delete(userKey=email, alias=alias).execute()
        message.send('`{}` からエイリアス `{}` を削除しました'.format(email, alias))
    except HttpError as e:
        message.send('エイリアスの削除に失敗しました\n`{}`'.format(e))


@respond_to('^gadmin\s+alias\s+(insert|delete)\s+(.*)\s+(.*)')
def gadmin_alias_insert_delete(message, command, email, alias):
    """
    指定したユーザーにエイリアスを追加/削除する

    - `$gadmin alias insert (email) (alias)`
    - `$gadmin alias delete (email) (alias)`

    :param command: コマンド
    :param email: メールアドレス
    :param alias: エイリアスのメールアドレス
    """
    service = _get_service()
    email = _remove_email_link(email)
    if '@' not in email:
        email += '@' + DOMAIN
    alias = _remove_email_link(alias)
    if '@' not in alias:
        alias += '@' + DOMAIN

    if command == 'insert':
        _gadmin_alias_insert(service, message, email, alias)
    elif command == 'delete':
        _gadmin_alias_delete(service, message, email, alias)


@respond_to('^gadmin\s+group\s+list')
def gadmin_group_list(message):
    """
    グループの一覧を返す
    """
{'fraction_non_alphanumeric': 0.15325842696629213, 'fraction_numerical': 0.0022471910112359553, 'mean_word_length': 3.3378817413905133, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 9, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '955901', 'n_tokens_mistral': 2782, 'n_tokens_neox': 2732, 'n_words': 466}