mirror of
https://github.com/gryf/slack-backup.git
synced 2025-12-17 11:30:25 +01:00
Treat bot user equally to regular users.
Currently, if messages are generated using bot users, such messages will crash slack_backup, since user.list API method returns only regular users. In this commit there is detected a situation, where we have 'bot_id' in the data, and in case there is no such user in local database, create it using data from bot.info API call.
This commit is contained in:
@@ -8,6 +8,7 @@ import logging
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
import slackclient
|
import slackclient
|
||||||
|
import sqlalchemy.orm.exc
|
||||||
|
|
||||||
from slack_backup import db
|
from slack_backup import db
|
||||||
from slack_backup import objects as o
|
from slack_backup import objects as o
|
||||||
@@ -75,14 +76,12 @@ class Client(object):
|
|||||||
|
|
||||||
def update_users(self):
|
def update_users(self):
|
||||||
"""Fetch and update user list with current state in db"""
|
"""Fetch and update user list with current state in db"""
|
||||||
logging.info("Fetching and updating user information in DB")
|
result = self._users_list()
|
||||||
result = self.slack.api_call("users.list", presence=0)
|
|
||||||
|
|
||||||
if not result.get("ok"):
|
if not result:
|
||||||
logging.error(result['error'])
|
|
||||||
return
|
return
|
||||||
|
|
||||||
for user_data in result['members']:
|
for user_data in result:
|
||||||
user = self.q(o.User).\
|
user = self.q(o.User).\
|
||||||
filter(o.User.slackid == user_data['id']).one_or_none()
|
filter(o.User.slackid == user_data['id']).one_or_none()
|
||||||
|
|
||||||
@@ -143,6 +142,42 @@ class Client(object):
|
|||||||
"""
|
"""
|
||||||
self.reporter.generate()
|
self.reporter.generate()
|
||||||
|
|
||||||
|
def _get_user(self, data):
|
||||||
|
"""
|
||||||
|
Return an User object. It can be regular one, or a bot. In case of
|
||||||
|
bot, check if it exists in db, and in case of failure - create it,
|
||||||
|
since bots are not returned by user.list API method.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
return self.q(o.User).filter(o.User.slackid == data['user']).one()
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
return self.q(o.User).filter(o.User.slackid ==
|
||||||
|
data['comment']['user']).one()
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
return self.q(o.User).filter(o.User.slackid ==
|
||||||
|
data['bot_id']).one()
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
except sqlalchemy.orm.exc.NoResultFound:
|
||||||
|
result = self.slack.api_call('bots.info', bot=data['bot_id'])
|
||||||
|
if not result.get("ok"):
|
||||||
|
logging.error(result['error'])
|
||||||
|
return None
|
||||||
|
|
||||||
|
user = o.User(result['bot'])
|
||||||
|
user.real_name = result['bot']['name']
|
||||||
|
self.session.add(user)
|
||||||
|
self.session.flush()
|
||||||
|
return user
|
||||||
|
|
||||||
|
raise ValueError('Cannot identify user out of data:' + str(data))
|
||||||
|
|
||||||
def _create_message(self, data, channel):
|
def _create_message(self, data, channel):
|
||||||
"""
|
"""
|
||||||
Create message with corresponding possible metadata, like reactions,
|
Create message with corresponding possible metadata, like reactions,
|
||||||
@@ -154,12 +189,7 @@ class Client(object):
|
|||||||
|
|
||||||
logging.debug('Message data: %s', json.dumps(data))
|
logging.debug('Message data: %s', json.dumps(data))
|
||||||
|
|
||||||
try:
|
user = self._get_user(data)
|
||||||
user = self.q(o.User).\
|
|
||||||
filter(o.User.slackid == data['user']).one()
|
|
||||||
except KeyError:
|
|
||||||
user = self.q(o.User).\
|
|
||||||
filter(o.User.slackid == data['comment']['user']).one()
|
|
||||||
|
|
||||||
if not data['text'].strip():
|
if not data['text'].strip():
|
||||||
logging.info("Skipping message from `%s' since it's empty",
|
logging.info("Skipping message from `%s' since it's empty",
|
||||||
@@ -288,7 +318,8 @@ class Client(object):
|
|||||||
Get users list using Slack API. Return list of channel data or None
|
Get users list using Slack API. Return list of channel data or None
|
||||||
in case of error.
|
in case of error.
|
||||||
"""
|
"""
|
||||||
result = self.slack.api_call("users.list", presence=0)
|
logging.info("Fetching and updating user information in DB")
|
||||||
|
result = self.slack.api_call("users.list")
|
||||||
|
|
||||||
if not result.get("ok"):
|
if not result.get("ok"):
|
||||||
logging.error(result['error'])
|
logging.error(result['error'])
|
||||||
|
|||||||
Reference in New Issue
Block a user