def __init__(self, token: str, sleep_for=0, log_to_file=False, slacker: Optional[Slacker] = None, session=None): """ :param token: the slack token, see README.md for details :type token: str :param sleep_for: sleep for x (float) seconds between delete calls :type sleep_for: float :param log_to_file: enable logging to file :type log_to_file: bool :param slacker: optional slacker instance for better customization :type slacker: Slacker :param session: optional session instance for better customization :type session: Session """ self.log = SlackLogger(log_to_file, sleep_for) self.token = token self.log.debug("start") if slacker: self.api = slacker else: slack = Slacker(token, session=session if session else Session()) slack.rate_limit_retries = 2 self.api = slack self.users = ByKeyLookup[SlackUser]([SlackUser(m, self) for m in _safe_list(slack.users.list(), "members")], lambda v: [v.name, v.id]) self.log.debug("collected users %s", self.users) # determine one self profile = _safe_attr(slack.users.profile.get(), "profile") myself = next((u for u in self.users if u.matches_profile(profile)), None) if not myself: self.log.error("cannot determine my own user, using the first one or a dummy one") self.myself = self.users[0] or self._add_dummy_user("?????") else: self.myself = myself self.channels = [SlackChannel(m, self._resolve_users(m["members"]), slack.channels, self) for m in _safe_list(slack.channels.list(), "channels")] self.log.debug("collected channels %s", self.channels) self.groups = [ SlackChannel(m, self._resolve_users(_safe_list(slack.conversations.members(m["id"]), "members")), slack.conversations, self) for m in _safe_list(slack.conversations.list(types="private_channel"), "channels") ] self.log.debug("collected groups %s", self.groups) self.mpim = [SlackChannel(m, self._resolve_users(m["members"]), slack.mpim, self) for m in _safe_list(slack.mpim.list(), "groups")] self.log.debug("collected mpim %s", self.mpim) self.ims = [SlackDirectMessage(m, self.resolve_user(m["user"]), slack.im, self) for m in _safe_list(slack.im.list(), "ims")] self.log.debug("collected ims %s", self.ims) # all different types with a similar interface self.conversations = self.channels + self.groups + self.mpim self.conversations.extend(self.ims) # pylint: disable=invalid-name self.c = ByKeyLookup[Union[SlackChannel, SlackDirectMessage]](self.conversations, lambda v: [v.name, v.id])
# Get and parse command line arguments args = Args() time_range = TimeRange(args.start_time, args.end_time) # Nice slack API wrapper with Session() as session: if args.proxy: slack = Slacker(args.token, http_proxy=args.proxy, https_proxy=args.proxy, session=session) else: slack = Slacker(args.token, session=session) if hasattr(slack, 'rate_limit_retries'): slack.rate_limit_retries = 2 # So we can print slack's object beautifully pp = pprint.PrettyPrinter(indent=4) # Count how many items we deleted counter = Counter() # Initial logger logger = logging.getLogger('slack-cleaner') logger.setLevel(10) # Log deleted messages/files if we're gonna actually log the task if args.log: ts = datetime.now().strftime('%Y%m%d-%H%M%S') file_log_handler = logging.FileHandler('slack-cleaner.' + ts + '.log')