Esempio n. 1
0
class SlackBot(ChatBot):
    """
    params:
     - slack_token(str):
    """

    def __init__(self, slack_token, redis_host, redis_port):
        print('Starting Slackbot')

        self.slacksocket = SlackSocket(slack_token, event_filters=['message'])
        self.me = self.slacksocket.user

        print('Connected to Slack as %s' % self.me)

        super().__init__(redis_host, redis_port)

    @property
    def messages(self):
        for event in self.slacksocket.events():
            log.debug('saw event %s' % event.json)
            if self.me in event.mentions:
                yield self._parse(event)

    def reply(self, msg, channel):
        # skip any empty messages
        if not msg or msg == 'EOF':
            return

        # make codeblock if message is multiline
        if isinstance(msg, list):
            msg = '```' + '\n'.join(msg) + '```'
        else:
            msg = '`' + msg + '`'

        self.slacksocket.send_msg(msg, channel_name=channel, confirm=False)
        log.debug('sent "%s" to "%s"' % (msg, channel))

    @staticmethod
    def _parse(event):
        """
        Parse slack event, removing @ mention
        """
        words = event.event['text'].split(' ')
        words.pop(0)

        return (' '.join(words), event.event['user'], event.event['channel'])
Esempio n. 2
0
def main():
    # Get the default Slack channel from config
    config = ConfigParser()
    config.read('config.ini')
    default_channel = config.get('slack', 'default_channel')

    # Create a SlackSocket instance with select filters
    event_filters = ['message']
    s = SlackSocket(os.environ['SLACK_TOKEN'], translate=True, event_filters=event_filters)

    # Try to create an instance of the bot
    try:
        botmod = eli5bot.BotMod(s)
    except Exception as e:
        msg = s.send_msg('Failed to start bot.\n Exception: %s' % e, channel_name=default_channel, confirm=False)
Esempio n. 3
0
def notify():
    teams = {}

    with open('teams.pickle', 'rb') as f:
        teams = pickle.load(f)
        print(teams.keys())

    for team_key in teams:
        team = teams[team_key]

        SLACK_TOKEN = ''
        with open('tokens.pickle', 'rb') as f:
            tokens = pickle.load(f)
            print(tokens)
            SLACK_TOKEN = tokens[team_key][0]

        slack_socket = SlackSocket(SLACK_TOKEN, translate=True)
        slack = Slacker(SLACK_TOKEN)

        people = team['people']
        channels = team['channels']

        for key in people:
            person = people[key]
            print(person.name)

            compute_person_channel_morale(slack, people, channels, person.name)
            morale = person.morale
            print(morale)

            if type(morale) is float and morale < 0.15:
                try:
                    res = slack.im.open(person._id)
                    c_id = res.body['channel']['id']
                    msg = slack_socket.send_msg(
                        'hey, you seem to be a bit down today. is everything alright?',
                        channel_id=c_id)
                    if msg.sent:
                        print('message sent to: ' + person.name)
                except:
                    pass
Esempio n. 4
0
def notify():
    teams = {}

    with open('teams.pickle', 'rb') as f:
        teams = pickle.load(f)
        print(teams.keys())

    for team_key in teams:
        team = teams[team_key]

        SLACK_TOKEN = ''
        with open('tokens.pickle', 'rb') as f:
            tokens = pickle.load(f)
            print(tokens)
            SLACK_TOKEN = tokens[team_key][0]

        slack_socket = SlackSocket(SLACK_TOKEN, translate=True)
        slack = Slacker(SLACK_TOKEN)

        people = team['people']
        channels = team['channels']

        for key in people:
            person = people[key]
            print(person.name)

            compute_person_channel_morale(slack, people, channels, person.name)
            morale = person.morale
            print(morale)

            if type(morale) is float and morale < 0.15:
                try:
                    res = slack.im.open(person._id)
                    c_id = res.body['channel']['id']
                    msg = slack_socket.send_msg('hey, you seem to be a bit down today. is everything alright?', channel_id=c_id)
                    if msg.sent:
                        print('message sent to: ' + person.name)
                except:
                    pass
Esempio n. 5
0
import json
import env
from slacksocket import SlackSocket
from NWSData import AreaDiscussion

# translate will lookup and replace user and channel IDs with their
# human-readable names. default true.
s = SlackSocket(env.apikey, translate=True)

while True:
    event = json.loads(s.get_event().json)
    print(event['type'])
    if event['type'] == 'message' and event['text'].split(' ', 1)[0].lower() == 'discussion':
        print('dis')
        try:
            version = int(event['text'].split(' ', 1)[1])
            print("args present")
        except:
            print("arts not present")
            pass
        d = AreaDiscussion(version=version)
        message = "```" + d.returnDiscussion() + "```"
        s.send_msg(message, "weather-test")
    else:
        pass
Esempio n. 6
0
    try:
        s = SlackSocket(slackToken)
    except:
        import sys
        import tools.shenanigans
        if shenanigansState:
            tools.shenanigans.enable()
            tools.shenanigans.reboot()
        else:
            print "That token was invalid!"
            sys.exit(2)

    setPresence('auto')

    s.send_msg("I'm combat ready!", debugChannel)

    for event in s.events():

        eventString = str(event.json)

        if (eventString == '{}'):
            reboot()

        if (debugMode):
            s.send_msg(eventString, debugChannel)
            print(eventString)

        if shenanigansState and('_left' in eventString):
            import json
            import tools.shenanigans
Esempio n. 7
0
class GameMaster(object):
    """
    Manages user sessions.
    """
    def __init__(self, config):
        #  Slack config
        slack_api_token = config.get('slack', 'api_token')
        self._slack_username = config.get('slack', 'bot_username')
        self._slack = SlackSocket(slack_api_token, translate=True)
        self._slack_events = self._slack.events()
        self._slack_sessions = {}
        self._slack_event_handler = Thread(target=self._handle_slack_events,
                                           name='event_handler')

        #  Frotz config
        self._frotz_binary = config.get('frotz', 'path')
        self._frotz_story_file = config.get('frotz', 'story')

        #  Logging config
        self._logs_dir = config.get('frotzlack', 'logs_dir')
        error_log_path = os.path.join(self._logs_dir, 'frotzlack.log')
        self._global_handler = RotatingFileHandler(error_log_path)
        self._global_handler.setLevel(logging.WARNING)

        #  Other config
        self._admins = config.get('frotzlack', 'admins').split(',')

        self._stop_requested = False
        self._slack_event_handler.start()

    def _event_is_game_input(self, event):
        event_attrs = event.event
        is_game_input = 'type' in event_attrs.keys() and \
            event_attrs['type'] == 'message' and \
            event_attrs['user'] in self._slack_sessions and \
            event_attrs['user'] != self._slack_username and \
            self._slack_username not in event.mentions and \
            event_attrs['channel'] == event_attrs['user']
        return is_game_input

    def _event_is_command(self, event):
        event_attrs = event.event
        return 'type' in event_attrs.keys() and \
               event_attrs['type'] == 'message' and \
               self._slack_username in event.mentions

    def _handle_game_input(self, user, game_input):
        session = self._slack_sessions[user]
        if game_input.strip() == 'save' or game_input.strip() == 'load':
            session.send("Sorry, I can't save or load games yet.")
        elif game_input.strip() == 'quit':
            session.send("Sorry, I can't quit the game yet.")
        else:
            session.put(game_input)

    def _start_session(self, username):
        def send_msg(msg):
            self._slack.send_msg(msg, channel_id=channel_id, confirm=False)

        channel_id = self._slack.get_im_channel(username)['id']

        session_logger = logging.getLogger(username)
        session_logger.setLevel(logging.INFO)
        session_log_path = os.path.join(self._logs_dir, username + '.log')
        session_handler = RotatingFileHandler(session_log_path)
        session_handler.setLevel(logging.INFO)
        session_logger.addHandler(session_handler)
        session_logger.addHandler(self._global_handler)

        slack_session = SlackSession(send_msg, channel_id)
        frotz_session = FrotzSession(self._frotz_binary,
                                     self._frotz_story_file, session_logger)
        self._slack_sessions[username] = slack_session
        Session(slack_session, frotz_session)

    def _reject_command(self, username, command):
        channel = self._slack.get_im_channel(username)
        message = "Sorry, I don't recognize the command `{0}`"
        self._slack.send_msg(message.format(command), channel_id=channel['id'])

    def _stop_server(self):
        pool = ThreadPool()
        for session in self._slack_sessions.values():

            def polite_stop():
                session.send("Sorry, the server is shutting down now.")
                session.kill()

            pool.apply_async(polite_stop)
        pool.close()
        pool.join()
        self._stop_requested = True

    def _handle_slack_events(self):
        while not self._stop_requested:
            event = self._slack_events.next()
            event_attrs = event.event
            if self._event_is_game_input(event):
                msg = event_attrs['text']
                self._handle_game_input(event_attrs['user'], msg)
            elif self._event_is_command(event):
                command = event_attrs['text']
                user = event_attrs['user']
                if 'stop' in command and user in self._admins:
                    self._stop_server()
                elif 'play' in command:
                    self._start_session(user)
                else:
                    self._reject_command(event_attrs['user'], command)
Esempio n. 8
0
class GameMaster(object):
    """
    Manages user sessions.
    """
    def __init__(self, config):
        #  Slack config
        slack_api_token = config.get('slack', 'api_token')
        self._slack_username = config.get('slack', 'bot_username')
        self._slack = SlackSocket(slack_api_token, translate=True)
        self._slack_events = self._slack.events()
        self._slack_sessions = {}
        self._slack_event_handler = Thread(target=self._handle_slack_events,
                                           name='event_handler')

        #  Frotz config
        self._frotz_binary = config.get('frotz', 'path')
        self._frotz_story_file = config.get('frotz', 'story')

        #  Logging config
        self._logs_dir = config.get('frotzlack', 'logs_dir')
        error_log_path = os.path.join(self._logs_dir, 'frotzlack.log')
        self._global_handler = RotatingFileHandler(error_log_path)
        self._global_handler.setLevel(logging.WARNING)

        #  Other config
        self._admins = config.get('frotzlack', 'admins').split(',')

        self._stop_requested = False
        self._slack_event_handler.start()

    def _event_is_game_input(self, event):
        event_attrs = event.event
        is_game_input = 'type' in event_attrs.keys() and \
            event_attrs['type'] == 'message' and \
            event_attrs['user'] in self._slack_sessions and \
            event_attrs['user'] != self._slack_username and \
            self._slack_username not in event.mentions and \
            event_attrs['channel'] == event_attrs['user']
        return is_game_input

    def _event_is_command(self, event):
        event_attrs = event.event
        return 'type' in event_attrs.keys() and \
               event_attrs['type'] == 'message' and \
               self._slack_username in event.mentions

    def _handle_game_input(self, user, game_input):
        session = self._slack_sessions[user]
        if game_input.strip() == 'save' or game_input.strip() == 'load':
            session.send("Sorry, I can't save or load games yet.")
        elif game_input.strip() == 'quit':
            session.send("Sorry, I can't quit the game yet.")
        else:
            session.put(game_input)

    def _start_session(self, username):
        def send_msg(msg):
            self._slack.send_msg(msg, channel_id=channel_id, confirm=False)

        channel_id = self._slack.get_im_channel(username)['id']

        session_logger = logging.getLogger(username)
        session_logger.setLevel(logging.INFO)
        session_log_path = os.path.join(self._logs_dir, username + '.log')
        session_handler = RotatingFileHandler(session_log_path)
        session_handler.setLevel(logging.INFO)
        session_logger.addHandler(session_handler)
        session_logger.addHandler(self._global_handler)

        slack_session = SlackSession(send_msg, channel_id)
        frotz_session = FrotzSession(self._frotz_binary,
                                     self._frotz_story_file,
                                     session_logger)
        self._slack_sessions[username] = slack_session
        Session(slack_session, frotz_session)

    def _reject_command(self, username, command):
        channel = self._slack.get_im_channel(username)
        message = "Sorry, I don't recognize the command `{0}`"
        self._slack.send_msg(message.format(command), channel_id=channel['id'])

    def _stop_server(self):
        pool = ThreadPool()
        for session in self._slack_sessions.values():
            def polite_stop():
                session.send("Sorry, the server is shutting down now.")
                session.kill()
            pool.apply_async(polite_stop)
        pool.close()
        pool.join()
        self._stop_requested = True

    def _handle_slack_events(self):
        while not self._stop_requested:
            event = self._slack_events.next()
            event_attrs = event.event
            if self._event_is_game_input(event):
                msg = event_attrs['text']
                self._handle_game_input(event_attrs['user'], msg)
            elif self._event_is_command(event):
                command = event_attrs['text']
                user = event_attrs['user']
                if 'stop' in command and user in self._admins:
                    self._stop_server()
                elif 'play' in command:
                    self._start_session(user)
                else:
                    self._reject_command(event_attrs['user'], command)
Esempio n. 9
0
File: joy.py Progetto: canzhiye/joy
def start_joy(team_id, bot_id):
    SLACK_TOKEN = ''
    with open('tokens.pickle', 'rb') as f:
        tokens = pickle.load(f)
        SLACK_TOKEN = tokens[team_id][0]

    slack_socket = SlackSocket(SLACK_TOKEN, translate=True)
    slack = Slacker(SLACK_TOKEN)

    response = slack.channels.list()
    channels = {}
    for c in [u for u in response.body['channels']]:
        name = c['name']
        user_id = c['id']

        channels[name] = Channel(name, user_id)

    response = slack.users.list()
    people = {}
    for p in [u for u in response.body['members']]:
        name = p['name']
        user_id = p['id']

        person = User(name, user_id)
        if 'is_admin' in p:
            person.manager = p['is_admin']
        else:
            person.manager = False

        people[name] = person

    print('starting joy on ' + team_id)

    for event in slack_socket.events():
        res = json.loads(event.json)

        if 'team' in res and res['team'] == team_id and res['type'] == 'message' and 'user' in res and res['user'] != 'joy':
            print(res)
            team_id = res['team']
            message = res['text']
            user = res['user']
            channel = res['channel']
            timestamp = res['ts']

            if bot_id in message:
                if 'get morale' in message.lower():
                    t = message.lower().split('get morale ')
                    person = ''
                    if len(t) > 1:
                        person = t[1]
                        # print(person)
                        slack_socket.send_msg(str(compute_person_channel_morale(slack, people, channels, person)), channel_name=channel)
                    else:
                        slack_socket.send_msg(str(compute_team_morale(people)), channel_name=channel)
                continue

            res = tone_analyzer.tone(text=message)
            emotional_tone = res['children'][0]
            writing_tone = res['children'][1]
            social_tone = res['children'][2]

            cheerfulness = float(emotional_tone['children'][0]['normalized_score'])
            negative = float(emotional_tone['children'][1]['normalized_score'])
            anger = float(emotional_tone['children'][2]['normalized_score'])

            analytical = float(writing_tone['children'][0]['normalized_score'])
            confident = float(writing_tone['children'][1]['normalized_score'])
            tentative = float(writing_tone['children'][2]['normalized_score'])
           
            openness = float(social_tone['children'][0]['normalized_score'])
            agreeableness = float(social_tone['children'][1]['normalized_score'])
            conscientiousness = float(social_tone['children'][2]['normalized_score'])

            sentiment = {
                'cheerfulness' : [cheerfulness],
                'negative' : [negative],
                'anger' : [anger],
                'analytical' : [analytical],
                'confident' : [confident],
                'tentative' : [tentative],
                'openness' : [openness],
                'agreeableness' : [agreeableness],
                'conscientiousness' : [conscientiousness]         
            }

            
            teams = {}
            try:
                with open('teams.pickle', 'rb') as f:
                    teams = pickle.load(f)
                    # print('load current teams: ' + str(teams.keys()))
            except:
                pass

            if team_id in teams:
                if channel in channels:
                    teams[team_id]['channels'][channel].add_sentiment(sentiment)
                    channels = teams[team_id]['channels']

                if user in people:
                    teams[team_id]['people'][user].add_sentiment(sentiment)
                    people = teams[team_id]['people']
            else:
                d = {'channels' : channels, 'people' : people}
                teams[team_id] = d

            # print('saving ' + team_id)
            # print('current teams: ' + str(teams.keys()))

            with open('teams.pickle', 'wb') as f:
                pickle.dump(teams, f)