Esempio n. 1
0
    def cmd_badge_create_request(command):

        user_info_r = slack_client.get_userinfo(command['team_id'],
                                                command['user_id'])
        if user_info_r.status != 200:
            current_app.logger.warning(
                f"Got an unknown userinfo response: {user_info_r.status}")
            return

        user_info = user_info_r.json
        current_app.logger.debug(user_info)
        if not user_info['user']['is_admin']:
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color": settings.KARMA_COLOR,
                    "text": "Only Slack admins can create badges."
                }]
            }
            slack_client.command_reply(command['team_id'],
                                       command['response_url'], message)
            return

        dialog = {
            "callback_id":
            "karma-badge-create-0",
            "title":
            "Create a badge",
            "submit_label":
            "Create",
            "elements": [{
                "label": "Badge (emoji)",
                "name": "badge",
                "type": "text",
                "placeholder": ":slack:"
            }, {
                "label": "Description",
                "name": "description",
                "type": "text",
                "placeholder": "Designated Slack Experts"
            }, {
                "label": "Owner (@user or @group)",
                "name": "owner",
                "type": "text",
                "placeholder": "@groupname"
            }]
        }
        args = command['text'].split()
        if len(args) > 1:
            dialog['elements'][0]['value'] = args[1]
        slack_client.dialog_open(command['team_id'], command['trigger_id'],
                                 dialog)
        return
Esempio n. 2
0
    def blacklisted(workspace_id, user_id):
        # Maybe someday be able to blacklist specific users
        if user_id == "USLACKBOT":
            return True

        userinfo_r = slack_client.get_userinfo(workspace_id, user_id)
        if userinfo_r.status != 200:
            return False
        userinfo = userinfo_r.json
        if userinfo['user']['is_bot']:
            return True

        return False
Esempio n. 3
0
    def cmd_badge_delete_complete(self, interaction):

        user_info_r = slack_client.get_userinfo(interaction['team']['id'],
                                                interaction['user']['id'])
        if user_info_r.status != 200:
            current_app.logger.warning(
                f"Got an unknown userinfo response: {user_info_r.status}")
            return

        user_info = user_info_r.json
        if not user_info['user']['is_admin']:
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color": settings.KARMA_COLOR,
                    "text": "Only Slack admins can create badges."
                }]
            }
            slack_client.command_reply(interaction['team']['id'],
                                       interaction['response_url'], message)
            return

        actions = interaction['actions']
        for action in actions:
            if action['name'] == 'delete':
                badge = action['value']
                if badge == 'no':
                    return

                self.delete_badge(interaction['team']['id'], badge)

                message = {
                    "response_type":
                    "ephemeral",
                    "attachments": [{
                        "color": settings.KARMA_COLOR,
                        "text": f"Badge {badge} deleted."
                    }]
                }
                slack_client.command_reply(interaction['team']['id'],
                                           interaction['response_url'],
                                           message)

        return
Esempio n. 4
0
    def cmd_badge_update_complete(self, interaction):
        data = interaction['submission']
        current_app.logger.debug("submitted data:", interaction)
        errors = False

        user_info_r = slack_client.get_userinfo(interaction['team']['id'],
                                                interaction['user']['id'])
        if user_info_r.status != 200:
            current_app.logger.warning(
                f"Got an unknown userinfo response: {user_info_r.status}")
            return

        user_info = user_info_r.json
        if not user_info['user']['is_admin']:
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color": settings.KARMA_COLOR,
                    "text": "Only Slack admins can create badges."
                }]
            }
            current_app.logger.debug(
                slack_client.command_reply(interaction['team']['id'],
                                           interaction['response_url'],
                                           message))  # noqa 501
            return

        badge = interaction['callback_id'].replace('karma-badge-update-', '')
        badge_info = self.get_badge_info(interaction['team']['id'], badge)
        if not badge_info:
            current_app.logger.debug(
                f"callback_id {interaction['callback_id']}")
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color": settings.KARMA_COLOR,
                    "text": "Unknown badge"
                }]
            }
            slack_client.command_reply(interaction['team']['id'],
                                       interaction['response_url'], message)
            errors = True

        if data['owner'][0] == '@':
            data['owner'] = data['owner'][1:]

        user = slack_client.lookup_usergroup(interaction['team']['id'],
                                             data['owner'])
        owner = None
        if user:
            owner = user['id']
        else:
            user = slack_client.lookup_user(interaction['team']['id'],
                                            data['owner'])
            if user:
                owner = user['id']
            else:
                message = {
                    "response_type":
                    "ephemeral",
                    "attachments": [{
                        "color":
                        settings.KARMA_COLOR,
                        "text":
                        "Please select a User or User Group only."
                    }]
                }
                slack_client.command_reply(interaction['team']['id'],
                                           interaction['response_url'],
                                           message)
                errors = True

        if errors:
            return

        now = datetime.datetime.utcnow()
        data = {
            'type': 'badge_info',
            'badge': badge,
            'owner': owner,
            'owner_display': data['owner'],
            'description': data['description'],
            'date': now
        }
        collection = self.mongodb[interaction['team']['id']]
        collection.replace_one({'type': 'badge_info', 'badge': badge}, data)

        owner_escaped = f"<!subgroup^{owner}>"
        if owner[0] != "S":
            owner_escaped = f"<@{data['owner']}>"

        badge_users = self.get_badge_users(interaction['team']['id'], badge)
        badge_user_list = ""
        for user in badge_users:
            badge_user_list = f"{badge_user_list}<@{user}>\n"

        message = {
            'response_type':
            'ephemeral',
            'text':
            'Badge updated',
            'attachments': [{
                "footer":
                f"Badge created <!date^{int(badge_info['date'].timestamp())}^{{date_pretty}}|{badge_info['date']}>",  # noqa 501
                "color":
                settings.KARMA_COLOR,
                "fields": [{
                    "title": "Badge",
                    "value": badge_info['badge'],
                    "short": True
                }, {
                    "title": "Owner",
                    "value": owner_escaped,
                    "short": True
                }, {
                    "title": "Description",
                    "value": data['description'],
                    "short": False
                }, {
                    "title": "Badge Holders",
                    "value": badge_user_list,
                    "short": False
                }]
            }]
        }

        slack_client.command_reply(interaction['team']['id'],
                                   interaction['response_url'], message)
Esempio n. 5
0
    def cmd_badge_update_request(self, command):
        user_info_r = slack_client.get_userinfo(command['team_id'],
                                                command['user_id'])
        if user_info_r.status != 200:
            current_app.logger.warning(
                f"Got an unknown userinfo response: {user_info_r.status}")
            return

        user_info = user_info_r.json
        if not user_info['user']['is_admin']:
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color": settings.KARMA_COLOR,
                    "text": "Only Slack admins can create badges."
                }]
            }
            slack_client.command_reply(command['team_id'],
                                       command['response_url'], message)
            return

        errors = False
        args = command['text'].split(' ')
        current_app.logger.debug(args)
        m_emoji = regex.emoji_re.search(args[1])
        if not m_emoji:
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color": settings.KARMA_COLOR,
                    "text": "Not a badge."
                }]
            }
            slack_client.command_reply(command['team_id'],
                                       command['response_url'], message)
            errors = True

        badge_info = self.get_badge_info(command['team_id'],
                                         m_emoji.group('emoji'))

        if not badge_info:
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color": settings.KARMA_COLOR,
                    "text": "Not a badge."
                }]
            }
            slack_client.command_reply(command['team_id'],
                                       command['response_url'], message)
            errors = True

        if errors:
            current_app.logger.info("found errors")
            return

        dialog = {
            "callback_id":
            f"karma-badge-update-{badge_info['badge']}",
            "title":
            f"Update badge {badge_info['badge'][:12]}",
            "submit_label":
            "Update",
            "elements": [{
                "label": "Description",
                "name": "description",
                "type": "text",
                "placeholder": "Designated Slack Experts",
                "value": badge_info['description']
            }, {
                "label": "Owner (@user or @group)",
                "name": "owner",
                "type": "text",
                "placeholder": "@groupname",
                "value": f"@{badge_info['owner_display']}"
            }]
        }
        current_app.logger.debug(dialog)
        current_app.logger.debug(
            slack_client.dialog_open(command['team_id'], command['trigger_id'],
                                     dialog))
        return
Esempio n. 6
0
    def cmd_badge_delete_request(self, command):

        user_info_r = slack_client.get_userinfo(command['team_id'],
                                                command['user_id'])
        if user_info_r.status != 200:
            current_app.logger.warning(
                f"Got an unknown userinfo response: {user_info_r.status}")
            return

        user_info = user_info_r.json
        current_app.logger.debug(user_info)
        if not user_info['user']['is_admin']:
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color": settings.KARMA_COLOR,
                    "text": "Only Slack admins can delete badges."
                }]
            }
            slack_client.command_reply(command['team_id'],
                                       command['response_url'], message)
            return

        args = command['text'].split()
        if len(args) != 2:
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color": settings.KARMA_COLOR,
                    "text": "Usage: `/badge delete :badgename:`"
                }]
            }
            slack_client.command_reply(command['team_id'],
                                       command['response_url'], message)
            return

        badge_info = self.get_badge_info(workspace_id=command['team_id'],
                                         badge=args[1])
        if not badge_info:
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color":
                    settings.KARMA_COLOR,
                    "text":
                    f"The badge {args[1]} is already deleted."
                }]
            }
            slack_client.command_reply(command['team_id'],
                                       command['response_url'], message)
            return

        message = {
            "text":
            f"Are you sure you want to delete the badge {args[1]}?",
            "color":
            settings.KARMA_COLOR,
            "attachments": [{
                "text":
                f"Deleting cannot be undone, and will remove the badge {args[1]} from all users that have it.",  # noqa E501
                "fallback":
                "You are unable to choose a game",
                "callback_id":
                "karma-badge-delete-0",
                "color":
                settings.KARMA_COLOR,
                "attachment_type":
                "default",
                "actions": [
                    {
                        "name": "delete",
                        "text": "Yes",
                        "type": "button",
                        "style": "danger",
                        "value": args[1],
                        "confirm": {
                            "title": "Are you sure?",
                            "text":
                            f"Deleting cannot be undone, and will remove the badge {args[1]} from all users that have it.",  # noqa E501
                            "ok_text": "Yes",
                            "dismiss_text": "No"
                        }
                    },
                    {
                        "name": "delete",
                        "text": "No",
                        "type": "button",
                        "value": "no"
                    }
                ]
            }]
        }
        slack_client.command_reply(command['team_id'], command['response_url'],
                                   message)
        return
Esempio n. 7
0
    def cmd_badge_create_complete(self, interaction):
        data = interaction['submission']
        current_app.logger.debug(f"submitted data: {interaction}")
        errors = False

        user_info_r = slack_client.get_userinfo(interaction['team']['id'],
                                                interaction['user']['id'])
        if user_info_r.status != 200:
            current_app.logger.warning(
                f"Got an unknown userinfo response: {user_info_r.status}")
            return

        user_info = user_info_r.json
        if not user_info['user']['is_admin']:
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color": settings.KARMA_COLOR,
                    "text": "Only Slack admins can create badges."
                }]
            }
            slack_client.command_reply(interaction['team']['id'],
                                       interaction['response_url'], message)
            return
        current_app.logger.info("user is an admin")
        badge_info = self.get_badge_info(interaction['team']['id'],
                                         data['badge'])
        if badge_info:
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color":
                    settings.KARMA_COLOR,
                    "text":
                    f"The badge {data['badge']} already exists."
                }]
            }
            slack_client.command_reply(interaction['team']['id'],
                                       interaction['response_url'], message)
            errors = True

        current_app.logger.info("badge is new")
        if not regex.emoji_re.match(data['badge']):
            message = {
                "response_type":
                "ephemeral",
                "attachments": [{
                    "color": settings.KARMA_COLOR,
                    "text": "The badge must be an emoji."
                }]
            }
            slack_client.command_reply(interaction['team']['id'],
                                       interaction['response_url'], message)
            errors = True

        current_app.logger.info("Badge is an emoji")
        if data['owner'][0] == '@':
            data['owner'] = data['owner'][1:]

        user = slack_client.lookup_usergroup(interaction['team']['id'],
                                             data['owner'])
        owner = None
        if user:
            owner = user['id']
        else:
            user = slack_client.lookup_user(interaction['team']['id'],
                                            data['owner'])
            if user:
                owner = user['id']
            else:
                message = {
                    "response_type":
                    "ephemeral",
                    "attachments": [{
                        "color":
                        settings.KARMA_COLOR,
                        "text":
                        "Please select a User or User Group only."
                    }]
                }
                slack_client.command_reply(interaction['team']['id'],
                                           interaction['response_url'],
                                           message)
                errors = True

        if errors:
            return

        now = datetime.datetime.utcnow()
        data = {
            'type': 'badge_info',
            'badge': data['badge'],
            'owner': owner,
            'owner_display': data['owner'],
            'description': data['description'],
            'date': now
        }
        collection = self.mongodb[interaction['team']['id']]
        collection.insert_one(data)

        current_app.logger.debug("data[owner] '{owner}'")
        owner_escaped = f"<!subteam^{owner}>"
        if data['owner'][0] != "S":
            owner_escaped = f"<@{owner}>"

        message = {
            'response_type':
            'ephemeral',
            'text':
            'Badge created',
            'attachments': [{
                "color":
                settings.KARMA_COLOR,
                "footer":
                f"Badge created <!date^{int(now.timestamp())}^{{date_pretty}}|{now}>",
                "fields": [{
                    "title": "Badge",
                    "value": data['badge'],
                    "short": True
                }, {
                    "title": "Owner",
                    "value": owner_escaped,
                    "short": True
                }, {
                    "title": "Description",
                    "value": data['description'],
                    "short": False
                }]
            }]
        }

        slack_client.command_reply(interaction['team']['id'],
                                   interaction['response_url'], message)