slack_neuralyzer 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/.codeclimate.yml +16 -0
 - data/.gitignore +9 -0
 - data/.rspec +2 -0
 - data/.travis.yml +6 -0
 - data/Gemfile +4 -0
 - data/LICENSE.txt +21 -0
 - data/README.md +216 -0
 - data/Rakefile +6 -0
 - data/bin/console +14 -0
 - data/bin/setup +8 -0
 - data/bin/slack_neuralyzer +13 -0
 - data/lib/slack_api/errors/not_found.rb +9 -0
 - data/lib/slack_api/errors/response.rb +9 -0
 - data/lib/slack_api/slack_api.rb +1 -0
 - data/lib/slack_neuralyzer.rb +26 -0
 - data/lib/slack_neuralyzer/args_parser.rb +98 -0
 - data/lib/slack_neuralyzer/cleaner/base.rb +73 -0
 - data/lib/slack_neuralyzer/cleaner/files.rb +41 -0
 - data/lib/slack_neuralyzer/cleaner/messages.rb +83 -0
 - data/lib/slack_neuralyzer/cli.rb +23 -0
 - data/lib/slack_neuralyzer/colorizable.rb +16 -0
 - data/lib/slack_neuralyzer/dict.rb +118 -0
 - data/lib/slack_neuralyzer/errors/mutually_exclusive_arguments.rb +9 -0
 - data/lib/slack_neuralyzer/errors/required_arguments.rb +9 -0
 - data/lib/slack_neuralyzer/helper.rb +23 -0
 - data/lib/slack_neuralyzer/logger.rb +23 -0
 - data/lib/slack_neuralyzer/multi_io.rb +34 -0
 - data/lib/slack_neuralyzer/version.rb +3 -0
 - data/screenshots/general_test_token.png +0 -0
 - data/screenshots/neuralyzer.gif +0 -0
 - data/screenshots/slack_neuralyzer_demo.gif +0 -0
 - data/slack_neuralyzer.gemspec +28 -0
 - metadata +161 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA1:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: f34f12786efe803fc3109712824067b26c27e228
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 9e84e469278787d33e1438b8306110ce7c2b0c41
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 9d2c9932289e8bdbbee6e12318eaf4192b8466eac8fe6f9037acfe764a530c8a1bd1c823d1841c23302f16c39a7edb45d740f3a9978bf93b55a38316c85c267b
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: d88b648cc1f468161e75477b37c6265a44b72a2b02ac7c929299f7a61f72c2ce18e596621b37379f712cf38d16a1b2c5c1ab55cba369d659e88b534cb025bcba
         
     | 
    
        data/.codeclimate.yml
    ADDED
    
    
    
        data/.gitignore
    ADDED
    
    
    
        data/.rspec
    ADDED
    
    
    
        data/.travis.yml
    ADDED
    
    
    
        data/Gemfile
    ADDED
    
    
    
        data/LICENSE.txt
    ADDED
    
    | 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            The MIT License (MIT)
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Copyright (c) 2016 Leon Ji
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Permission is hereby granted, free of charge, to any person obtaining a copy
         
     | 
| 
      
 6 
     | 
    
         
            +
            of this software and associated documentation files (the "Software"), to deal
         
     | 
| 
      
 7 
     | 
    
         
            +
            in the Software without restriction, including without limitation the rights
         
     | 
| 
      
 8 
     | 
    
         
            +
            to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
         
     | 
| 
      
 9 
     | 
    
         
            +
            copies of the Software, and to permit persons to whom the Software is
         
     | 
| 
      
 10 
     | 
    
         
            +
            furnished to do so, subject to the following conditions:
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            The above copyright notice and this permission notice shall be included in
         
     | 
| 
      
 13 
     | 
    
         
            +
            all copies or substantial portions of the Software.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
         
     | 
| 
      
 16 
     | 
    
         
            +
            IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
         
     | 
| 
      
 17 
     | 
    
         
            +
            FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
         
     | 
| 
      
 18 
     | 
    
         
            +
            AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
         
     | 
| 
      
 19 
     | 
    
         
            +
            LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
         
     | 
| 
      
 20 
     | 
    
         
            +
            OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
         
     | 
| 
      
 21 
     | 
    
         
            +
            THE SOFTWARE.
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,216 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Slack Neuralyzer
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            [](https://travis-ci.org/mgleon08/slack_neuralyzer)
         
     | 
| 
      
 4 
     | 
    
         
            +
            [](https://coveralls.io/github/mgleon08/slack_neuralyzer?branch=master)
         
     | 
| 
      
 5 
     | 
    
         
            +
            [](https://codeclimate.com/github/mgleon08/slack_neuralyzer)
         
     | 
| 
      
 6 
     | 
    
         
            +
            [](https://hakiri.io/github/mgleon08/slack_neuralyzer/master)
         
     | 
| 
      
 7 
     | 
    
         
            +
            [](https://github.com/mgleon08/slack_neuralyzer/blob/master/LICENSE.txt)
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            Slack Neuralyzer is a ruby gem for bulk delete messages and files on Slack channels.
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            The easiest way to clean up messages and files on Slack.
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            ## Installation
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            ```
         
     | 
| 
      
 18 
     | 
    
         
            +
            $ gem install slack_neuralyzer
         
     | 
| 
      
 19 
     | 
    
         
            +
            ```
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            ## Slack token
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            <a href='https://api.slack.com/web' target='_blank'><img src='screenshots/general_test_token.png' alt='general_test_token' width = '20%' /></a>
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            ##Getting Started
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            ### Show all channel names
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            `slack_neuralyzer -t <TOKEN> -s`
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 34 
     | 
    
         
            +
            All user direct:
         
     | 
| 
      
 35 
     | 
    
         
            +
              001. leon
         
     | 
| 
      
 36 
     | 
    
         
            +
              002. slackbot
         
     | 
| 
      
 37 
     | 
    
         
            +
              003. cleanerbot
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
            All channels (public):
         
     | 
| 
      
 40 
     | 
    
         
            +
              001. general
         
     | 
| 
      
 41 
     | 
    
         
            +
              002. random
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            All groups (private):
         
     | 
| 
      
 44 
     | 
    
         
            +
              001. private_channel
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            All multiparty direct:
         
     | 
| 
      
 47 
     | 
    
         
            +
              001. mpdm-leon--cleanerbot-1
         
     | 
| 
      
 48 
     | 
    
         
            +
              002. mpdm-leon--slackbot-1
         
     | 
| 
      
 49 
     | 
    
         
            +
            ```
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            ### Delete message(s)
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            >Rerun below command and use `-e | --execute` to actually delete the message(s).
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            * Channel
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            `-C | --channel` `-D | --direct` `-G | --group` `-M | --mpdirect`
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 60 
     | 
    
         
            +
            # Delete all user messages in general channel
         
     | 
| 
      
 61 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -C general -u all
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
            # Delete all user messages in leon direct channel
         
     | 
| 
      
 64 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -D leon -u all
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
            # Delete all user messages in private_channel groups channel
         
     | 
| 
      
 67 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -G private_channel -u all
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
            # Delete all user messages in mpdm-leon--cleanerbot-1 multiparty direct channel
         
     | 
| 
      
 70 
     | 
    
         
            +
            # (can `use slack_neuralyzer -t <TOKEN> -s` to see mpdirect channle name)
         
     | 
| 
      
 71 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -M mpdm-leon--cleanerbot-1 -u all
         
     | 
| 
      
 72 
     | 
    
         
            +
            ```
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
            * Specific user
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
            `-u | --user`
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 79 
     | 
    
         
            +
            # Delete leon messages in general channel
         
     | 
| 
      
 80 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -C general -u leon
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
            # if you want to specific all users, you can type 'all'
         
     | 
| 
      
 83 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -C general -u all
         
     | 
| 
      
 84 
     | 
    
         
            +
            ```
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
            * Specific Bot
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
            `-b | --bot`
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 91 
     | 
    
         
            +
            # Delete bots messages in general channel
         
     | 
| 
      
 92 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -C general -b cleanerbot
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
            # if you want to specific all bots, you can type 'all' (not bot users)
         
     | 
| 
      
 95 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -C general -b all
         
     | 
| 
      
 96 
     | 
    
         
            +
            ```
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
            * Delete message(s) between two dates
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
            `-A | --after` `-B | --before`
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 103 
     | 
    
         
            +
            # Delete all user messages in general channel at 20160101 to 20161212
         
     | 
| 
      
 104 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -C general -u all -A 20160101 -B 20161212
         
     | 
| 
      
 105 
     | 
    
         
            +
            ```
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
            * Delete message(s) with specified text
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
            `-R | --regex`
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 112 
     | 
    
         
            +
            # Delete all user messages with hello string in general channel
         
     | 
| 
      
 113 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -C general -u all -R hello
         
     | 
| 
      
 114 
     | 
    
         
            +
            ```
         
     | 
| 
      
 115 
     | 
    
         
            +
             
     | 
| 
      
 116 
     | 
    
         
            +
            ### Delete file(s)
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
            > File types: all, spaces, snippets, images, gdocs, docs, zips, pdfs
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
            >Rerun below command and use `-e | --execute` to actually delete the message(s).
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
      
 122 
     | 
    
         
            +
            * Channel
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
            `-C | --channel` `-D | --direct` `-G | --group` `-M | --mpdirect`
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 127 
     | 
    
         
            +
            # Delete all user upload all type file in general channel
         
     | 
| 
      
 128 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -f all -C general -u all
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
            # Delete leon upload all images file in leon direct channel
         
     | 
| 
      
 131 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -f images -D leon -u leon
         
     | 
| 
      
 132 
     | 
    
         
            +
             
     | 
| 
      
 133 
     | 
    
         
            +
            # Delete all user upload all pdfs file in private_channel groups channel
         
     | 
| 
      
 134 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -f pdfs -G private_channel -u all
         
     | 
| 
      
 135 
     | 
    
         
            +
             
     | 
| 
      
 136 
     | 
    
         
            +
            # Delete all user upload all zips file in mpdm-leon--cleanerbot-1 multiparty direct channel
         
     | 
| 
      
 137 
     | 
    
         
            +
            # (can `use slack_neuralyzer -t <TOKEN> -s` to see mpdirect channle name)
         
     | 
| 
      
 138 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -f zips -M mpdm-leon--cleanerbot-1 -u all
         
     | 
| 
      
 139 
     | 
    
         
            +
            ```
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
            * Specific user and file type
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
            `-u | --user` `-f | --file`
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 146 
     | 
    
         
            +
            # Delete leon upload images file in general channel
         
     | 
| 
      
 147 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -f images -C general -u leon
         
     | 
| 
      
 148 
     | 
    
         
            +
            ```
         
     | 
| 
      
 149 
     | 
    
         
            +
             
     | 
| 
      
 150 
     | 
    
         
            +
            * Delete file between two dates
         
     | 
| 
      
 151 
     | 
    
         
            +
             
     | 
| 
      
 152 
     | 
    
         
            +
            `-A | --after` `-B | --before`
         
     | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
      
 154 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 155 
     | 
    
         
            +
            # Delete all user upload all type file in general channel at 20160101 to 20161212
         
     | 
| 
      
 156 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -f all -C general -u all -A 20160101 -B 20161212
         
     | 
| 
      
 157 
     | 
    
         
            +
            ```
         
     | 
| 
      
 158 
     | 
    
         
            +
             
     | 
| 
      
 159 
     | 
    
         
            +
            ### Generate log file
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
            `-l | --log`
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
      
 163 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 164 
     | 
    
         
            +
            # Generate a log file in the current directory in ./slack_neuralyzer/YYYY-MM-DDTHH:MM:SS
         
     | 
| 
      
 165 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -C general -u all -A 20160101 -B 20161212 -l
         
     | 
| 
      
 166 
     | 
    
         
            +
            ```
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
             
     | 
| 
      
 169 
     | 
    
         
            +
            ### Rate
         
     | 
| 
      
 170 
     | 
    
         
            +
             
     | 
| 
      
 171 
     | 
    
         
            +
            `-r | --rate`
         
     | 
| 
      
 172 
     | 
    
         
            +
             
     | 
| 
      
 173 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 174 
     | 
    
         
            +
            # Delay between API calls in seconds (default:0.05)
         
     | 
| 
      
 175 
     | 
    
         
            +
            slack_neuralyzer -t <TOKEN> -m -C general -u all -r 0.01
         
     | 
| 
      
 176 
     | 
    
         
            +
            ```
         
     | 
| 
      
 177 
     | 
    
         
            +
             
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
      
 179 
     | 
    
         
            +
            ### Help
         
     | 
| 
      
 180 
     | 
    
         
            +
             
     | 
| 
      
 181 
     | 
    
         
            +
            `-h | --help`
         
     | 
| 
      
 182 
     | 
    
         
            +
             
     | 
| 
      
 183 
     | 
    
         
            +
            ```
         
     | 
| 
      
 184 
     | 
    
         
            +
            usage:
         
     | 
| 
      
 185 
     | 
    
         
            +
                slack_neuralyzer [options]
         
     | 
| 
      
 186 
     | 
    
         
            +
                See https://github.com/mgleon08/slack_neuralyzer for more information.
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
      
 188 
     | 
    
         
            +
            options:
         
     | 
| 
      
 189 
     | 
    
         
            +
                -t, --token TOKEN                Slack API token (https://api.slack.com/web)
         
     | 
| 
      
 190 
     | 
    
         
            +
                -s, --show                       Show all users, channels, groups and multiparty direct names
         
     | 
| 
      
 191 
     | 
    
         
            +
                -m, --message                    Specifies that the delete object is messages
         
     | 
| 
      
 192 
     | 
    
         
            +
                -f, --file TYPE                  Specifies that the delete object is files of a certain type (Type: all, spaces, snippets, images, gdocs, docs, zips, pdfs)
         
     | 
| 
      
 193 
     | 
    
         
            +
                -C, --channel CHANNEL            Public channel name (e.g., general, random)
         
     | 
| 
      
 194 
     | 
    
         
            +
                -D, --direct DIRECT              Direct messages channel name (e.g., leon)
         
     | 
| 
      
 195 
     | 
    
         
            +
                -G, --group GROUP                Private groups channel name
         
     | 
| 
      
 196 
     | 
    
         
            +
                -M, --mpdirect MPDIRECT          Multiparty direct messages channel name (e.g., mpdm-leon--bot-1 [--show option to see name])
         
     | 
| 
      
 197 
     | 
    
         
            +
                -u, --user USER                  Delete messages/files from the specific user (if you want to specific all users, you can type 'all')
         
     | 
| 
      
 198 
     | 
    
         
            +
                -b, --bot BOT                    Delete messages from the specific bot (not bot users, if you want to specific all bots, you can type 'all')
         
     | 
| 
      
 199 
     | 
    
         
            +
                -A, --after DATE                 Delete messages/files after than this time (YYYYMMDD)
         
     | 
| 
      
 200 
     | 
    
         
            +
                -B, --before DATE                Delete messages/files before than this time (YYYYMMDD)
         
     | 
| 
      
 201 
     | 
    
         
            +
                -R, --regex TEXT                 Delete messages with specified text (regular expression)
         
     | 
| 
      
 202 
     | 
    
         
            +
                -e, --execute                    Execute the delete task
         
     | 
| 
      
 203 
     | 
    
         
            +
                -l, --log                        Generate a log file in the current directory
         
     | 
| 
      
 204 
     | 
    
         
            +
                -r, --rate RATE                  Delay between API calls in seconds (default:0.1)
         
     | 
| 
      
 205 
     | 
    
         
            +
                -v, --version                    Show the SlackNeuralyzer version
         
     | 
| 
      
 206 
     | 
    
         
            +
                -h, --help                       Show this message
         
     | 
| 
      
 207 
     | 
    
         
            +
            ```
         
     | 
| 
      
 208 
     | 
    
         
            +
             
     | 
| 
      
 209 
     | 
    
         
            +
            ## Contributing
         
     | 
| 
      
 210 
     | 
    
         
            +
             
     | 
| 
      
 211 
     | 
    
         
            +
            Bug reports and pull requests are welcome on GitHub at [`https://github.com/mgleon08/slack_neuralyzer/pulls`](https://github.com/mgleon08/slack_neuralyzer/pulls)
         
     | 
| 
      
 212 
     | 
    
         
            +
             
     | 
| 
      
 213 
     | 
    
         
            +
            ## Copyright & License
         
     | 
| 
      
 214 
     | 
    
         
            +
             
     | 
| 
      
 215 
     | 
    
         
            +
            * Copyright (c) 2016 Leon Ji. See [LICENSE.txt](https://github.com/mgleon08/slack_neuralyzer/blob/master/LICENSE.txt) for further details.
         
     | 
| 
      
 216 
     | 
    
         
            +
            * The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
         
     | 
    
        data/Rakefile
    ADDED
    
    
    
        data/bin/console
    ADDED
    
    | 
         @@ -0,0 +1,14 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "bundler/setup"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "slack_neuralyzer"
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            # You can add fixtures and/or initialization code here to make experimenting
         
     | 
| 
      
 7 
     | 
    
         
            +
            # with your gem easier. You can also use a different console, if you like.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            # (If you use this, don't forget to add pry to your Gemfile!)
         
     | 
| 
      
 10 
     | 
    
         
            +
            # require "pry"
         
     | 
| 
      
 11 
     | 
    
         
            +
            # Pry.start
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            require "irb"
         
     | 
| 
      
 14 
     | 
    
         
            +
            IRB.start
         
     | 
    
        data/bin/setup
    ADDED
    
    
| 
         @@ -0,0 +1,13 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
            require_relative '../lib/slack_neuralyzer'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            begin
         
     | 
| 
      
 5 
     | 
    
         
            +
              args   = SlackNeuralyzer::ArgsParser.new(ARGV)
         
     | 
| 
      
 6 
     | 
    
         
            +
              logger = SlackNeuralyzer::Logger.default(args.log)
         
     | 
| 
      
 7 
     | 
    
         
            +
              dict   = SlackNeuralyzer::Dict.new(args.token)
         
     | 
| 
      
 8 
     | 
    
         
            +
              cli    = SlackNeuralyzer::Cli.new(args, dict, logger)
         
     | 
| 
      
 9 
     | 
    
         
            +
              cli.run
         
     | 
| 
      
 10 
     | 
    
         
            +
            rescue => e
         
     | 
| 
      
 11 
     | 
    
         
            +
              $stderr.puts e.message
         
     | 
| 
      
 12 
     | 
    
         
            +
              exit
         
     | 
| 
      
 13 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'slack'
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            $LOAD_PATH << File.dirname(__FILE__)
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'optparse'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'time'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'colorize'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'logger'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            require 'slack_api/slack_api'
         
     | 
| 
      
 9 
     | 
    
         
            +
            require 'slack_api/errors/not_found'
         
     | 
| 
      
 10 
     | 
    
         
            +
            require 'slack_api/errors/response'
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            require 'slack_neuralyzer/logger'
         
     | 
| 
      
 13 
     | 
    
         
            +
            require 'slack_neuralyzer/multi_io'
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            require 'slack_neuralyzer/helper'
         
     | 
| 
      
 16 
     | 
    
         
            +
            require 'slack_neuralyzer/colorizable'
         
     | 
| 
      
 17 
     | 
    
         
            +
            require 'slack_neuralyzer/args_parser'
         
     | 
| 
      
 18 
     | 
    
         
            +
            require 'slack_neuralyzer/dict'
         
     | 
| 
      
 19 
     | 
    
         
            +
            require 'slack_neuralyzer/cli'
         
     | 
| 
      
 20 
     | 
    
         
            +
            require 'slack_neuralyzer/cleaner/base'
         
     | 
| 
      
 21 
     | 
    
         
            +
            require 'slack_neuralyzer/cleaner/messages'
         
     | 
| 
      
 22 
     | 
    
         
            +
            require 'slack_neuralyzer/cleaner/files'
         
     | 
| 
      
 23 
     | 
    
         
            +
            require 'slack_neuralyzer/errors/mutually_exclusive_arguments'
         
     | 
| 
      
 24 
     | 
    
         
            +
            require 'slack_neuralyzer/errors/required_arguments'
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            require 'slack_neuralyzer/version'
         
     | 
| 
         @@ -0,0 +1,98 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SlackNeuralyzer
         
     | 
| 
      
 2 
     | 
    
         
            +
              class ArgsParser
         
     | 
| 
      
 3 
     | 
    
         
            +
                attr_accessor :token, :show, :message, :file, :channel, :direct,
         
     | 
| 
      
 4 
     | 
    
         
            +
                              :group, :mpdirect, :user, :bot, :after, :before,
         
     | 
| 
      
 5 
     | 
    
         
            +
                              :execute, :log, :rate, :regex
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                def initialize(args)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @args = args
         
     | 
| 
      
 9 
     | 
    
         
            +
                  init_arg_groups
         
     | 
| 
      
 10 
     | 
    
         
            +
                  parse_args
         
     | 
| 
      
 11 
     | 
    
         
            +
                  validates_mutex_args
         
     | 
| 
      
 12 
     | 
    
         
            +
                  validates_required_args
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def init_arg_groups
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @arg_groups = {
         
     | 
| 
      
 17 
     | 
    
         
            +
                    'required': [
         
     | 
| 
      
 18 
     | 
    
         
            +
                      [:token],
         
     | 
| 
      
 19 
     | 
    
         
            +
                      [:message, :file],
         
     | 
| 
      
 20 
     | 
    
         
            +
                      [:channel, :direct, :group, :mpdirect],
         
     | 
| 
      
 21 
     | 
    
         
            +
                      [:user, :bot]
         
     | 
| 
      
 22 
     | 
    
         
            +
                    ],
         
     | 
| 
      
 23 
     | 
    
         
            +
                    'mutex': [
         
     | 
| 
      
 24 
     | 
    
         
            +
                      [:message, :file],
         
     | 
| 
      
 25 
     | 
    
         
            +
                      [:channel, :direct, :group, :mpdirect],
         
     | 
| 
      
 26 
     | 
    
         
            +
                      [:file, :bot],
         
     | 
| 
      
 27 
     | 
    
         
            +
                      [:file, :regex]
         
     | 
| 
      
 28 
     | 
    
         
            +
                    ]
         
     | 
| 
      
 29 
     | 
    
         
            +
                  }
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                def rate_limit
         
     | 
| 
      
 33 
     | 
    
         
            +
                  rate || 0.05
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                private
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                def parse_args
         
     | 
| 
      
 39 
     | 
    
         
            +
                  opts = OptionParser.new
         
     | 
| 
      
 40 
     | 
    
         
            +
                  opts.banner = usage_msg
         
     | 
| 
      
 41 
     | 
    
         
            +
                  opts.separator ''
         
     | 
| 
      
 42 
     | 
    
         
            +
                  opts.separator 'options:'
         
     | 
| 
      
 43 
     | 
    
         
            +
                  opts.on('-t', '--token TOKEN', 'Slack API token (https://api.slack.com/web)') { |token| self.token = token }
         
     | 
| 
      
 44 
     | 
    
         
            +
                  opts.on('-s', '--show', 'Show all users, channels, groups and multiparty direct names') { self.show = true }
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                  opts.on('-m', '--message', 'Specifies that the delete object is messages') { self.message = true }
         
     | 
| 
      
 47 
     | 
    
         
            +
                  opts.on('-f', '--file TYPE', "Specifies that the delete object is files of a certain type (Type: all, spaces, snippets, images, gdocs, docs, zips, pdfs)") { |file| self.file = file }
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                  opts.on('-C', '--channel CHANNEL', 'Public channel name (e.g., general, random)') { |channel| self.channel = channel }
         
     | 
| 
      
 50 
     | 
    
         
            +
                  opts.on('-D', '--direct DIRECT', 'Direct messages channel name (e.g., leon)') { |direct| self.direct = direct }
         
     | 
| 
      
 51 
     | 
    
         
            +
                  opts.on('-G', '--group GROUP', 'Private groups channel name') { |group| self.group = group }
         
     | 
| 
      
 52 
     | 
    
         
            +
                  opts.on('-M', '--mpdirect MPDIRECT', 'Multiparty direct messages channel name (e.g., mpdm-leon--bot-1 [--show option to see name])') { |mpdirect| self.mpdirect = mpdirect }
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                  opts.on('-u', '--user USER', "Delete messages/files from the specific user (if you want to specific all users, you can type 'all')") { |user| self.user = user }
         
     | 
| 
      
 55 
     | 
    
         
            +
                  opts.on('-b', '--bot BOT', "Delete messages from the specific bot (not bot users, if you want to specific all bots, you can type 'all')") { |bot| self.bot = bot }
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                  opts.on('-A', '--after DATE', 'Delete messages/files after than this time (YYYYMMDD)') { |after| self.after = after }
         
     | 
| 
      
 58 
     | 
    
         
            +
                  opts.on('-B', '--before DATE', 'Delete messages/files before than this time (YYYYMMDD)') { |before| self.before = before }
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  opts.on('-R', '--regex TEXT', 'Delete messages with specified text (regular expression)') { |regex| self.regex = regex }
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                  opts.on('-e', '--execute', 'Execute the delete task') { self.execute = true }
         
     | 
| 
      
 63 
     | 
    
         
            +
                  opts.on('-l', '--log', 'Generate a log file in the current directory') { self.log = true }
         
     | 
| 
      
 64 
     | 
    
         
            +
                  opts.on('-r', '--rate RATE', Float, 'Delay between API calls in seconds (default:0.1)') { |rate| self.rate = rate }
         
     | 
| 
      
 65 
     | 
    
         
            +
                  opts.on('-v', '--version', 'Show the SlackNeuralyzer version') { puts("slack_neuralyzer #{SlackNeuralyzer::VERSION}"); exit }
         
     | 
| 
      
 66 
     | 
    
         
            +
                  opts.on('-h', '--help', 'Show this message') { puts(opts); exit }
         
     | 
| 
      
 67 
     | 
    
         
            +
                  opts.parse!(@args)
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                def usage_msg
         
     | 
| 
      
 71 
     | 
    
         
            +
                  <<-USAGE.freeze
         
     | 
| 
      
 72 
     | 
    
         
            +
            usage:
         
     | 
| 
      
 73 
     | 
    
         
            +
                slack_neuralyzer [options]
         
     | 
| 
      
 74 
     | 
    
         
            +
                See https://github.com/mgleon08/slack_neuralyzer for more information.
         
     | 
| 
      
 75 
     | 
    
         
            +
                  USAGE
         
     | 
| 
      
 76 
     | 
    
         
            +
                end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                def validates_required_args
         
     | 
| 
      
 79 
     | 
    
         
            +
                  @arg_groups[:required].each do |opts|
         
     | 
| 
      
 80 
     | 
    
         
            +
                    filters = opts.select{ |opt| !self.public_send(opt).nil? }
         
     | 
| 
      
 81 
     | 
    
         
            +
                    raise SlackNeuralyzer::Errors::RequiredArgumentsError.new(double_dash(opts).join(', ')) if filters.empty?
         
     | 
| 
      
 82 
     | 
    
         
            +
                    return unless self.show.nil?
         
     | 
| 
      
 83 
     | 
    
         
            +
                  end
         
     | 
| 
      
 84 
     | 
    
         
            +
                end
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                def validates_mutex_args
         
     | 
| 
      
 87 
     | 
    
         
            +
                  @arg_groups[:mutex].each do |opts|
         
     | 
| 
      
 88 
     | 
    
         
            +
                    return unless self.show.nil?
         
     | 
| 
      
 89 
     | 
    
         
            +
                    filters = opts.select{ |opt| !self.public_send(opt).nil? }
         
     | 
| 
      
 90 
     | 
    
         
            +
                    raise SlackNeuralyzer::Errors::MutuallyExclusiveArgumentsError.new(double_dash(filters).join(', ')) if filters.size > 1
         
     | 
| 
      
 91 
     | 
    
         
            +
                  end
         
     | 
| 
      
 92 
     | 
    
         
            +
                end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
                def double_dash(arrays)
         
     | 
| 
      
 95 
     | 
    
         
            +
                  arrays.map{ |array| array.to_s.prepend('--') }
         
     | 
| 
      
 96 
     | 
    
         
            +
                end
         
     | 
| 
      
 97 
     | 
    
         
            +
              end
         
     | 
| 
      
 98 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,73 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SlackNeuralyzer
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Cleaner
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Base
         
     | 
| 
      
 4 
     | 
    
         
            +
                  include Helper
         
     | 
| 
      
 5 
     | 
    
         
            +
                  include Colorizable
         
     | 
| 
      
 6 
     | 
    
         
            +
                  attr_reader :args, :dict, :channel_type, :logger
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                  def initialize(args, dict, logger)
         
     | 
| 
      
 9 
     | 
    
         
            +
                    @args   = args
         
     | 
| 
      
 10 
     | 
    
         
            +
                    @dict   = dict
         
     | 
| 
      
 11 
     | 
    
         
            +
                    @logger = logger
         
     | 
| 
      
 12 
     | 
    
         
            +
                    reset_counter
         
     | 
| 
      
 13 
     | 
    
         
            +
                    parse_to_ts(args.after, args.before)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                  private
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                  def get_user_id
         
     | 
| 
      
 19 
     | 
    
         
            +
                    user_id = args.user == 'all' ? -1 : dict.find_user_id(args.user)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    raise SlackApi::Errors::NotFoundError, "#{args.user} not found." unless args.bot || user_id
         
     | 
| 
      
 21 
     | 
    
         
            +
                    user_id
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                  def get_channel_id
         
     | 
| 
      
 25 
     | 
    
         
            +
                    if args.channel
         
     | 
| 
      
 26 
     | 
    
         
            +
                      @channel_type = 'channel'
         
     | 
| 
      
 27 
     | 
    
         
            +
                      channel_id    = dict.find_channel_id(args.channel)
         
     | 
| 
      
 28 
     | 
    
         
            +
                    elsif args.direct
         
     | 
| 
      
 29 
     | 
    
         
            +
                      @channel_type = 'direct'
         
     | 
| 
      
 30 
     | 
    
         
            +
                      user_id       = dict.find_user_id(args.direct)
         
     | 
| 
      
 31 
     | 
    
         
            +
                      channel_id    = dict.find_im_id(user_id)
         
     | 
| 
      
 32 
     | 
    
         
            +
                    elsif args.group
         
     | 
| 
      
 33 
     | 
    
         
            +
                      @channel_type = 'group'
         
     | 
| 
      
 34 
     | 
    
         
            +
                      channel_id    = dict.find_group_id(args.group)
         
     | 
| 
      
 35 
     | 
    
         
            +
                    elsif args.mpdirect
         
     | 
| 
      
 36 
     | 
    
         
            +
                      @channel_type = 'mpdirect'
         
     | 
| 
      
 37 
     | 
    
         
            +
                      channel_id    = dict.find_mpim_id(args.mpdirect)
         
     | 
| 
      
 38 
     | 
    
         
            +
                    end
         
     | 
| 
      
 39 
     | 
    
         
            +
                    raise SlackApi::Errors::NotFoundError, "#{current_channel} not found." unless channel_id
         
     | 
| 
      
 40 
     | 
    
         
            +
                    channel_id
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                  def current_channel
         
     | 
| 
      
 44 
     | 
    
         
            +
                    light_green("#{args.public_send(channel_type)} #{channel_type}")
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                  def time_format(time)
         
     | 
| 
      
 48 
     | 
    
         
            +
                    light_cyan("[#{parse_to_date(time)}]")
         
     | 
| 
      
 49 
     | 
    
         
            +
                  end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                  def delete_format
         
     | 
| 
      
 52 
     | 
    
         
            +
                    args.execute ? '(delete) '.light_red : ''
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  def not_have_any(type)
         
     | 
| 
      
 56 
     | 
    
         
            +
                    logger.info "#{current_channel} does not have any #{type}(s)"
         
     | 
| 
      
 57 
     | 
    
         
            +
                    exit
         
     | 
| 
      
 58 
     | 
    
         
            +
                  end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  def finish_text(type)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    text = "\n#{light_green(counter)} #{type}(s) in #{current_channel} "
         
     | 
| 
      
 62 
     | 
    
         
            +
                    if args.execute.nil? && counter.nonzero?
         
     | 
| 
      
 63 
     | 
    
         
            +
                      text << 'will be deleted.'
         
     | 
| 
      
 64 
     | 
    
         
            +
                      text << light_red("\nNow, you can rerun the command and use `-e | --execute` to actually delete the #{type}(s).")
         
     | 
| 
      
 65 
     | 
    
         
            +
                    else
         
     | 
| 
      
 66 
     | 
    
         
            +
                      text << 'have been deleted.'
         
     | 
| 
      
 67 
     | 
    
         
            +
                    end
         
     | 
| 
      
 68 
     | 
    
         
            +
                    text << light_blue("\nThe log file has been generated in the current directory") if args.log
         
     | 
| 
      
 69 
     | 
    
         
            +
                    text
         
     | 
| 
      
 70 
     | 
    
         
            +
                  end
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
              end
         
     | 
| 
      
 73 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,41 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SlackNeuralyzer
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Cleaner
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Files < Base
         
     | 
| 
      
 4 
     | 
    
         
            +
                  def clean
         
     | 
| 
      
 5 
     | 
    
         
            +
                    user_id    = get_user_id
         
     | 
| 
      
 6 
     | 
    
         
            +
                    channel_id = get_channel_id
         
     | 
| 
      
 7 
     | 
    
         
            +
                    clean_channel_file(channel_id, user_id)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                  private
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  def clean_channel_file(channel_id, user_id)
         
     | 
| 
      
 13 
     | 
    
         
            +
                    page, total_page = 0, nil
         
     | 
| 
      
 14 
     | 
    
         
            +
                    until page == total_page
         
     | 
| 
      
 15 
     | 
    
         
            +
                      page += 1
         
     | 
| 
      
 16 
     | 
    
         
            +
                      res = Slack.files_list(page: page, channel: channel_id, types: args.file, ts_from: start_time, ts_to: end_time)
         
     | 
| 
      
 17 
     | 
    
         
            +
                      raise SlackApi::Errors::ResponseError, res['error'] unless res['ok']
         
     | 
| 
      
 18 
     | 
    
         
            +
                      total_page = res['paging']['pages']
         
     | 
| 
      
 19 
     | 
    
         
            +
                      not_have_any('file') if total_page.zero?
         
     | 
| 
      
 20 
     | 
    
         
            +
                      res['files'].each do |file|
         
     | 
| 
      
 21 
     | 
    
         
            +
                        if args.user && (file['user'] == user_id || user_id == -1)
         
     | 
| 
      
 22 
     | 
    
         
            +
                          delete_file(file)
         
     | 
| 
      
 23 
     | 
    
         
            +
                        end
         
     | 
| 
      
 24 
     | 
    
         
            +
                      end
         
     | 
| 
      
 25 
     | 
    
         
            +
                    end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                    logger.info finish_text('file')
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  def delete_file(file)
         
     | 
| 
      
 31 
     | 
    
         
            +
                    file_time = time_format(file['timestamp'])
         
     | 
| 
      
 32 
     | 
    
         
            +
                    file_url  = light_magenta("(#{file['permalink']})")
         
     | 
| 
      
 33 
     | 
    
         
            +
                    delete    = delete_format
         
     | 
| 
      
 34 
     | 
    
         
            +
                    Slack.files_delete(file: file['id']) if args.execute
         
     | 
| 
      
 35 
     | 
    
         
            +
                    logger.info "#{delete}#{file_time} #{dict.find_user_name(file['user'])}: #{file['name']} #{file_url}"
         
     | 
| 
      
 36 
     | 
    
         
            +
                    increase_counter
         
     | 
| 
      
 37 
     | 
    
         
            +
                    sleep(args.rate_limit)
         
     | 
| 
      
 38 
     | 
    
         
            +
                  end
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,83 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SlackNeuralyzer
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Cleaner
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Messages < Base
         
     | 
| 
      
 4 
     | 
    
         
            +
                  def clean
         
     | 
| 
      
 5 
     | 
    
         
            +
                    user_id    = get_user_id
         
     | 
| 
      
 6 
     | 
    
         
            +
                    channel_id = get_channel_id
         
     | 
| 
      
 7 
     | 
    
         
            +
                    end_point  = get_history_end_point
         
     | 
| 
      
 8 
     | 
    
         
            +
                    clean_channel_messages(channel_id, user_id, end_point)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  private
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  def clean_channel_messages(channel_id, user_id, end_point)
         
     | 
| 
      
 14 
     | 
    
         
            +
                    has_more = true
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                    while has_more
         
     | 
| 
      
 17 
     | 
    
         
            +
                      res = Slack.public_send(end_point, channel: channel_id, oldest: start_time, latest: end_time)
         
     | 
| 
      
 18 
     | 
    
         
            +
                      raise SlackApi::Errors::ResponseError, res['error'] unless res['ok']
         
     | 
| 
      
 19 
     | 
    
         
            +
                      has_more = res['has_more']
         
     | 
| 
      
 20 
     | 
    
         
            +
                      messages = res['messages']
         
     | 
| 
      
 21 
     | 
    
         
            +
                      not_have_any('message') if messages.empty?
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                      messages.each do |msg|
         
     | 
| 
      
 24 
     | 
    
         
            +
                        @end_time = msg['ts']
         
     | 
| 
      
 25 
     | 
    
         
            +
                        dict.scan_user_id_to_transform(msg['text'])
         
     | 
| 
      
 26 
     | 
    
         
            +
                        next unless msg['type'] == 'message'
         
     | 
| 
      
 27 
     | 
    
         
            +
                        next if args.regex && !match_regex(msg['text'])
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                        if args.user && user_msg?(msg, user_id)
         
     | 
| 
      
 30 
     | 
    
         
            +
                          name = dict.find_user_name(msg['user'])
         
     | 
| 
      
 31 
     | 
    
         
            +
                          delete_message(channel_id, msg, name)
         
     | 
| 
      
 32 
     | 
    
         
            +
                        end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                        next unless args.bot && bot_msg?(msg)
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                        name = dict.find_bot_name(msg['bot_id'])
         
     | 
| 
      
 37 
     | 
    
         
            +
                        if args.bot == name || args.bot == 'all'
         
     | 
| 
      
 38 
     | 
    
         
            +
                          delete_message(channel_id, msg, name)
         
     | 
| 
      
 39 
     | 
    
         
            +
                        end
         
     | 
| 
      
 40 
     | 
    
         
            +
                      end
         
     | 
| 
      
 41 
     | 
    
         
            +
                    end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                    logger.info finish_text('message')
         
     | 
| 
      
 44 
     | 
    
         
            +
                  end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                  def user_msg?(msg, user_id)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    !bot_msg?(msg) && (msg['user'] == user_id || user_id == -1)
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                  def bot_msg?(msg)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    msg['subtype'] == 'bot_message'
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                  def delete_message(channel_id, msg, name)
         
     | 
| 
      
 55 
     | 
    
         
            +
                    Slack.chat_delete(channel: channel_id, ts: msg['ts']) if args.execute
         
     | 
| 
      
 56 
     | 
    
         
            +
                    logger.info "#{delete_format}#{time_format(msg['ts'])} #{name}: #{msg['text']}"
         
     | 
| 
      
 57 
     | 
    
         
            +
                    increase_counter
         
     | 
| 
      
 58 
     | 
    
         
            +
                    sleep(args.rate_limit)
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                  def get_history_end_point
         
     | 
| 
      
 62 
     | 
    
         
            +
                    if args.channel
         
     | 
| 
      
 63 
     | 
    
         
            +
                      :channels_history
         
     | 
| 
      
 64 
     | 
    
         
            +
                    elsif args.direct
         
     | 
| 
      
 65 
     | 
    
         
            +
                      :im_history
         
     | 
| 
      
 66 
     | 
    
         
            +
                    elsif args.group
         
     | 
| 
      
 67 
     | 
    
         
            +
                      :groups_history
         
     | 
| 
      
 68 
     | 
    
         
            +
                    elsif args.mpdirect
         
     | 
| 
      
 69 
     | 
    
         
            +
                      :mpim_history
         
     | 
| 
      
 70 
     | 
    
         
            +
                    end
         
     | 
| 
      
 71 
     | 
    
         
            +
                  end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                  def match_regex(text)
         
     | 
| 
      
 74 
     | 
    
         
            +
                    match_word = text.scan(/#{args.regex}/).flatten
         
     | 
| 
      
 75 
     | 
    
         
            +
                    return false if match_word.empty?
         
     | 
| 
      
 76 
     | 
    
         
            +
                    match_word.uniq.each do |word|
         
     | 
| 
      
 77 
     | 
    
         
            +
                      text.gsub!(/#{word}/, light_magenta(word.to_s))
         
     | 
| 
      
 78 
     | 
    
         
            +
                    end
         
     | 
| 
      
 79 
     | 
    
         
            +
                    text
         
     | 
| 
      
 80 
     | 
    
         
            +
                  end
         
     | 
| 
      
 81 
     | 
    
         
            +
                end
         
     | 
| 
      
 82 
     | 
    
         
            +
              end
         
     | 
| 
      
 83 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SlackNeuralyzer
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Cli
         
     | 
| 
      
 3 
     | 
    
         
            +
                attr_reader :args, :dict, :logger
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                def initialize(args, dict, logger)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  @args   = args
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @dict   = dict
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @logger = logger
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                def run
         
     | 
| 
      
 12 
     | 
    
         
            +
                  logger.info "Running slack_neuralyzer v#{SlackNeuralyzer::VERSION}\n"
         
     | 
| 
      
 13 
     | 
    
         
            +
                  sleep(1)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  if args.show
         
     | 
| 
      
 15 
     | 
    
         
            +
                    puts dict.show_all_channels
         
     | 
| 
      
 16 
     | 
    
         
            +
                  elsif args.message
         
     | 
| 
      
 17 
     | 
    
         
            +
                    Cleaner::Messages.new(args, dict, logger).clean
         
     | 
| 
      
 18 
     | 
    
         
            +
                  elsif args.file
         
     | 
| 
      
 19 
     | 
    
         
            +
                    Cleaner::Files.new(args, dict, logger).clean
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SlackNeuralyzer
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Colorizable
         
     | 
| 
      
 3 
     | 
    
         
            +
                [
         
     | 
| 
      
 4 
     | 
    
         
            +
                  :light_green,
         
     | 
| 
      
 5 
     | 
    
         
            +
                  :light_cyan,
         
     | 
| 
      
 6 
     | 
    
         
            +
                  :light_red,
         
     | 
| 
      
 7 
     | 
    
         
            +
                  :light_blue,
         
     | 
| 
      
 8 
     | 
    
         
            +
                  :light_yellow,
         
     | 
| 
      
 9 
     | 
    
         
            +
                  :light_magenta
         
     | 
| 
      
 10 
     | 
    
         
            +
                ].each do |color|
         
     | 
| 
      
 11 
     | 
    
         
            +
                  define_method(color) do |text|
         
     | 
| 
      
 12 
     | 
    
         
            +
                    text.to_s.public_send(color)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,118 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SlackNeuralyzer
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Dict
         
     | 
| 
      
 3 
     | 
    
         
            +
                include Colorizable
         
     | 
| 
      
 4 
     | 
    
         
            +
                attr_reader :channels, :ims, :groups, :mpims, :users, :bots
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                def initialize(token)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  Slack.token = token
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @users = {}
         
     | 
| 
      
 9 
     | 
    
         
            +
                  @channels = {}
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @groups = {}
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @ims = {}
         
     | 
| 
      
 12 
     | 
    
         
            +
                  @mpims = {}
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @bots = {}
         
     | 
| 
      
 14 
     | 
    
         
            +
                  init_all_dict
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                def show_all_channels
         
     | 
| 
      
 18 
     | 
    
         
            +
                  text = ''
         
     | 
| 
      
 19 
     | 
    
         
            +
                  text << light_blue("All user direct:\n")
         
     | 
| 
      
 20 
     | 
    
         
            +
                  text << list_names(users)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  text << light_blue("\nAll channels (public):\n")
         
     | 
| 
      
 22 
     | 
    
         
            +
                  text << list_names(channels)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  text << light_blue("\nAll groups (private):\n")
         
     | 
| 
      
 24 
     | 
    
         
            +
                  text << list_names(groups)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  text << light_blue("\nAll multiparty direct:\n")
         
     | 
| 
      
 26 
     | 
    
         
            +
                  text << list_names(mpims)
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                [:channel, :im, :group, :mpim, :user].each do |channel|
         
     | 
| 
      
 30 
     | 
    
         
            +
                  define_method("find_#{channel}_id".to_sym) do |name|
         
     | 
| 
      
 31 
     | 
    
         
            +
                    public_send("#{channel}s").key(name)
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  define_method("find_#{channel}_name".to_sym) do |name|
         
     | 
| 
      
 35 
     | 
    
         
            +
                    public_send("#{channel}s").invert.key(name)
         
     | 
| 
      
 36 
     | 
    
         
            +
                  end
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                def scan_user_id_to_transform(text)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  return text if text.nil?
         
     | 
| 
      
 41 
     | 
    
         
            +
                  scan_id = text.scan(/<@(?<bot>[[:alnum:][:punct:]]*)>/i).flatten
         
     | 
| 
      
 42 
     | 
    
         
            +
                  if scan_id.any?
         
     | 
| 
      
 43 
     | 
    
         
            +
                    scan_id.uniq.each do |id|
         
     | 
| 
      
 44 
     | 
    
         
            +
                      name = find_user_name(id)
         
     | 
| 
      
 45 
     | 
    
         
            +
                      text.gsub!(/<@#{id}>/, light_yellow("@#{name}"))
         
     | 
| 
      
 46 
     | 
    
         
            +
                    end
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
                  text
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                def find_bot_name(bot_id)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  build_bot_name(bot_id) unless bots.invert.key(bot_id)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  bots.invert.key(bot_id)
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                def build_bot_name(bot_id)
         
     | 
| 
      
 57 
     | 
    
         
            +
                  res = Slack.bots_info(bot: bot_id)
         
     | 
| 
      
 58 
     | 
    
         
            +
                  raise SlackApi::Errors::ResponseError, res['error'] unless res['ok']
         
     | 
| 
      
 59 
     | 
    
         
            +
                  @bots[bot_id] = res['bot']['name']
         
     | 
| 
      
 60 
     | 
    
         
            +
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                private
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                def init_all_dict
         
     | 
| 
      
 65 
     | 
    
         
            +
                  init_users_dict
         
     | 
| 
      
 66 
     | 
    
         
            +
                  init_channels_dict
         
     | 
| 
      
 67 
     | 
    
         
            +
                  init_groups_dict
         
     | 
| 
      
 68 
     | 
    
         
            +
                  init_ims_dict
         
     | 
| 
      
 69 
     | 
    
         
            +
                  init_mpims_dict
         
     | 
| 
      
 70 
     | 
    
         
            +
                end
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                def init_users_dict
         
     | 
| 
      
 73 
     | 
    
         
            +
                  res = Slack.users_list
         
     | 
| 
      
 74 
     | 
    
         
            +
                  raise SlackApi::Errors::ResponseError, res['error'] unless res['ok']
         
     | 
| 
      
 75 
     | 
    
         
            +
                  members = res['members']
         
     | 
| 
      
 76 
     | 
    
         
            +
                  members.each { |member| @users[member['id']] = member['name'] }
         
     | 
| 
      
 77 
     | 
    
         
            +
                end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                def init_channels_dict
         
     | 
| 
      
 80 
     | 
    
         
            +
                  res = Slack.channels_list
         
     | 
| 
      
 81 
     | 
    
         
            +
                  raise SlackApi::Errors::ResponseError, res['error'] unless res['ok']
         
     | 
| 
      
 82 
     | 
    
         
            +
                  channels = res['channels']
         
     | 
| 
      
 83 
     | 
    
         
            +
                  channels.each { |channel| @channels[channel['id']] = channel['name'] }
         
     | 
| 
      
 84 
     | 
    
         
            +
                end
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                def init_groups_dict
         
     | 
| 
      
 87 
     | 
    
         
            +
                  res = Slack.groups_list
         
     | 
| 
      
 88 
     | 
    
         
            +
                  raise SlackApi::Errors::ResponseError, res['error'] unless res['ok']
         
     | 
| 
      
 89 
     | 
    
         
            +
                  groups = res['groups']
         
     | 
| 
      
 90 
     | 
    
         
            +
                  groups.each do |group|
         
     | 
| 
      
 91 
     | 
    
         
            +
                    next if group['is_mpim'] != false
         
     | 
| 
      
 92 
     | 
    
         
            +
                    @groups[group['id']] = group['name']
         
     | 
| 
      
 93 
     | 
    
         
            +
                  end
         
     | 
| 
      
 94 
     | 
    
         
            +
                end
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                def init_ims_dict
         
     | 
| 
      
 97 
     | 
    
         
            +
                  res = Slack.im_list
         
     | 
| 
      
 98 
     | 
    
         
            +
                  raise SlackApi::Errors::ResponseError, res['error'] unless res['ok']
         
     | 
| 
      
 99 
     | 
    
         
            +
                  ims = res['ims']
         
     | 
| 
      
 100 
     | 
    
         
            +
                  ims.each { |im| @ims[im['id']] = im['user'] }
         
     | 
| 
      
 101 
     | 
    
         
            +
                end
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
                def init_mpims_dict
         
     | 
| 
      
 104 
     | 
    
         
            +
                  res = Slack.mpim_list
         
     | 
| 
      
 105 
     | 
    
         
            +
                  raise SlackApi::Errors::ResponseError, res['error'] unless res['ok']
         
     | 
| 
      
 106 
     | 
    
         
            +
                  mpims = res['groups']
         
     | 
| 
      
 107 
     | 
    
         
            +
                  mpims.each { |mpim| @mpims[mpim['id']] = mpim['name'] }
         
     | 
| 
      
 108 
     | 
    
         
            +
                end
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                def list_names(names)
         
     | 
| 
      
 111 
     | 
    
         
            +
                  ''.tap do |text|
         
     | 
| 
      
 112 
     | 
    
         
            +
                    names.values.each.with_index(1) do |name, index|
         
     | 
| 
      
 113 
     | 
    
         
            +
                      text << "  #{index.to_s.rjust(3, '0')}. #{name}\n"
         
     | 
| 
      
 114 
     | 
    
         
            +
                    end
         
     | 
| 
      
 115 
     | 
    
         
            +
                  end
         
     | 
| 
      
 116 
     | 
    
         
            +
                end
         
     | 
| 
      
 117 
     | 
    
         
            +
              end
         
     | 
| 
      
 118 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SlackNeuralyzer
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Helper
         
     | 
| 
      
 3 
     | 
    
         
            +
                attr_reader :counter, :start_time, :end_time
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                def parse_to_ts(start_time, end_time)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  end_time ||= Time.now.to_s
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @start_time = Time.parse(start_time).to_f if start_time
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @end_time   = Time.parse(end_time).to_f
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                def parse_to_date(ts)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  Time.at(ts.to_f).strftime('%Y-%m-%d %H:%M')
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def reset_counter
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @counter = 0
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                def increase_counter
         
     | 
| 
      
 20 
     | 
    
         
            +
                  @counter += 1
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SlackNeuralyzer
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Logger < ::Logger
         
     | 
| 
      
 3 
     | 
    
         
            +
                class << self
         
     | 
| 
      
 4 
     | 
    
         
            +
                  def default(log)
         
     | 
| 
      
 5 
     | 
    
         
            +
                    io = [STDOUT]
         
     | 
| 
      
 6 
     | 
    
         
            +
                    io << log_file if log
         
     | 
| 
      
 7 
     | 
    
         
            +
                    logger = Logger.new(MultiIO.new(*io))
         
     | 
| 
      
 8 
     | 
    
         
            +
                    logger.level = Logger::INFO
         
     | 
| 
      
 9 
     | 
    
         
            +
                    logger.formatter = proc do |_severity, _datetime, _progname, msg|
         
     | 
| 
      
 10 
     | 
    
         
            +
                      "#{msg}\n"
         
     | 
| 
      
 11 
     | 
    
         
            +
                    end
         
     | 
| 
      
 12 
     | 
    
         
            +
                    logger
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  def log_file
         
     | 
| 
      
 16 
     | 
    
         
            +
                    time = Time.now.strftime('%Y-%m-%dT%H:%M:%S')
         
     | 
| 
      
 17 
     | 
    
         
            +
                    FileUtils.mkdir_p('./slack_neuralyzer')
         
     | 
| 
      
 18 
     | 
    
         
            +
                    log_file = File.open("./slack_neuralyzer/#{time}.log", 'a')
         
     | 
| 
      
 19 
     | 
    
         
            +
                    log_file
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,34 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SlackNeuralyzer
         
     | 
| 
      
 2 
     | 
    
         
            +
              class MultiIO
         
     | 
| 
      
 3 
     | 
    
         
            +
                def initialize(*targets)
         
     | 
| 
      
 4 
     | 
    
         
            +
                  @targets = targets
         
     | 
| 
      
 5 
     | 
    
         
            +
                  @shell_colors = {
         
     | 
| 
      
 6 
     | 
    
         
            +
                    light_red:     '\\e\\[0;91;49m',
         
     | 
| 
      
 7 
     | 
    
         
            +
                    light_green:   '\\e\\[0;92;49m',
         
     | 
| 
      
 8 
     | 
    
         
            +
                    light_yellow:  '\\e\\[0;93;49m',
         
     | 
| 
      
 9 
     | 
    
         
            +
                    light_blue:    '\\e\\[0;94;49m',
         
     | 
| 
      
 10 
     | 
    
         
            +
                    light_magenta: '\\e\\[0;95;49m',
         
     | 
| 
      
 11 
     | 
    
         
            +
                    light_cyan:    '\\e\\[0;96;49m',
         
     | 
| 
      
 12 
     | 
    
         
            +
                    out_put:       '\\e\\[0m'
         
     | 
| 
      
 13 
     | 
    
         
            +
                  }
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                def write(args)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @targets.each do |target|
         
     | 
| 
      
 18 
     | 
    
         
            +
                    pretty_file_text(args) if target.is_a? File
         
     | 
| 
      
 19 
     | 
    
         
            +
                    target.write(args)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def close
         
     | 
| 
      
 24 
     | 
    
         
            +
                  @targets.each(&:close)
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def pretty_file_text(args)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  @shell_colors.values.each do |color|
         
     | 
| 
      
 29 
     | 
    
         
            +
                    args.gsub!(/#{color}/, '')
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                  args
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
         Binary file 
     | 
| 
         Binary file 
     | 
| 
         Binary file 
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # coding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
            lib = File.expand_path('../lib', __FILE__)
         
     | 
| 
      
 3 
     | 
    
         
            +
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'slack_neuralyzer/version'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            Gem::Specification.new do |spec|
         
     | 
| 
      
 7 
     | 
    
         
            +
              spec.name          = "slack_neuralyzer"
         
     | 
| 
      
 8 
     | 
    
         
            +
              spec.version       = SlackNeuralyzer::VERSION
         
     | 
| 
      
 9 
     | 
    
         
            +
              spec.authors       = ["Leon Ji"]
         
     | 
| 
      
 10 
     | 
    
         
            +
              spec.email         = ["mgleon08@gmail.com"]
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              spec.summary       = %q{The easiest way to clean up messages and files on Slack.}
         
     | 
| 
      
 13 
     | 
    
         
            +
              spec.description   = %q{This is a ruby gem for bulk delete messages and files on Slack channels.}
         
     | 
| 
      
 14 
     | 
    
         
            +
              spec.homepage      = "https://github.com/mgleon08/slack_neuralyzer"
         
     | 
| 
      
 15 
     | 
    
         
            +
              spec.license       = "MIT"
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              spec.files         = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
         
     | 
| 
      
 18 
     | 
    
         
            +
              spec.bindir        = "bin"
         
     | 
| 
      
 19 
     | 
    
         
            +
              spec.require_paths = ["lib"]
         
     | 
| 
      
 20 
     | 
    
         
            +
              spec.executables   = ["slack_neuralyzer"]
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              spec.add_development_dependency "bundler", "~> 1.11"
         
     | 
| 
      
 23 
     | 
    
         
            +
              spec.add_development_dependency "rake", "~> 10.0"
         
     | 
| 
      
 24 
     | 
    
         
            +
              spec.add_development_dependency "rspec", "~> 3.0"
         
     | 
| 
      
 25 
     | 
    
         
            +
              spec.add_development_dependency "coveralls", "~> 0.8.1"
         
     | 
| 
      
 26 
     | 
    
         
            +
              spec.add_runtime_dependency "slack-api", "~> 1.2"
         
     | 
| 
      
 27 
     | 
    
         
            +
              spec.add_runtime_dependency "colorize", "~> 0.8"
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    ADDED
    
    | 
         @@ -0,0 +1,161 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            --- !ruby/object:Gem::Specification
         
     | 
| 
      
 2 
     | 
    
         
            +
            name: slack_neuralyzer
         
     | 
| 
      
 3 
     | 
    
         
            +
            version: !ruby/object:Gem::Version
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.1.0
         
     | 
| 
      
 5 
     | 
    
         
            +
            platform: ruby
         
     | 
| 
      
 6 
     | 
    
         
            +
            authors:
         
     | 
| 
      
 7 
     | 
    
         
            +
            - Leon Ji
         
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire: 
         
     | 
| 
      
 9 
     | 
    
         
            +
            bindir: bin
         
     | 
| 
      
 10 
     | 
    
         
            +
            cert_chain: []
         
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2016-10-18 00:00:00.000000000 Z
         
     | 
| 
      
 12 
     | 
    
         
            +
            dependencies:
         
     | 
| 
      
 13 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 14 
     | 
    
         
            +
              name: bundler
         
     | 
| 
      
 15 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 16 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 17 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 18 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 19 
     | 
    
         
            +
                    version: '1.11'
         
     | 
| 
      
 20 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 21 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 22 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 23 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 24 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 25 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 26 
     | 
    
         
            +
                    version: '1.11'
         
     | 
| 
      
 27 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 28 
     | 
    
         
            +
              name: rake
         
     | 
| 
      
 29 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 30 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 31 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 32 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 33 
     | 
    
         
            +
                    version: '10.0'
         
     | 
| 
      
 34 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 35 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 36 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 37 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 38 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 39 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 40 
     | 
    
         
            +
                    version: '10.0'
         
     | 
| 
      
 41 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 42 
     | 
    
         
            +
              name: rspec
         
     | 
| 
      
 43 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 44 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 45 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 46 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 47 
     | 
    
         
            +
                    version: '3.0'
         
     | 
| 
      
 48 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 49 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 50 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 51 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 52 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 53 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 54 
     | 
    
         
            +
                    version: '3.0'
         
     | 
| 
      
 55 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 56 
     | 
    
         
            +
              name: coveralls
         
     | 
| 
      
 57 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 58 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 59 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 60 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 61 
     | 
    
         
            +
                    version: 0.8.1
         
     | 
| 
      
 62 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 63 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 64 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 65 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 66 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 67 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 68 
     | 
    
         
            +
                    version: 0.8.1
         
     | 
| 
      
 69 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 70 
     | 
    
         
            +
              name: slack-api
         
     | 
| 
      
 71 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 72 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 73 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 74 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 75 
     | 
    
         
            +
                    version: '1.2'
         
     | 
| 
      
 76 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 77 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 78 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 79 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 80 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 81 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 82 
     | 
    
         
            +
                    version: '1.2'
         
     | 
| 
      
 83 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 84 
     | 
    
         
            +
              name: colorize
         
     | 
| 
      
 85 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 86 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 87 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 88 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 89 
     | 
    
         
            +
                    version: '0.8'
         
     | 
| 
      
 90 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 91 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 92 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 93 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 94 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 95 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 96 
     | 
    
         
            +
                    version: '0.8'
         
     | 
| 
      
 97 
     | 
    
         
            +
            description: This is a ruby gem for bulk delete messages and files on Slack channels.
         
     | 
| 
      
 98 
     | 
    
         
            +
            email:
         
     | 
| 
      
 99 
     | 
    
         
            +
            - mgleon08@gmail.com
         
     | 
| 
      
 100 
     | 
    
         
            +
            executables:
         
     | 
| 
      
 101 
     | 
    
         
            +
            - slack_neuralyzer
         
     | 
| 
      
 102 
     | 
    
         
            +
            extensions: []
         
     | 
| 
      
 103 
     | 
    
         
            +
            extra_rdoc_files: []
         
     | 
| 
      
 104 
     | 
    
         
            +
            files:
         
     | 
| 
      
 105 
     | 
    
         
            +
            - ".codeclimate.yml"
         
     | 
| 
      
 106 
     | 
    
         
            +
            - ".gitignore"
         
     | 
| 
      
 107 
     | 
    
         
            +
            - ".rspec"
         
     | 
| 
      
 108 
     | 
    
         
            +
            - ".travis.yml"
         
     | 
| 
      
 109 
     | 
    
         
            +
            - Gemfile
         
     | 
| 
      
 110 
     | 
    
         
            +
            - LICENSE.txt
         
     | 
| 
      
 111 
     | 
    
         
            +
            - README.md
         
     | 
| 
      
 112 
     | 
    
         
            +
            - Rakefile
         
     | 
| 
      
 113 
     | 
    
         
            +
            - bin/console
         
     | 
| 
      
 114 
     | 
    
         
            +
            - bin/setup
         
     | 
| 
      
 115 
     | 
    
         
            +
            - bin/slack_neuralyzer
         
     | 
| 
      
 116 
     | 
    
         
            +
            - lib/slack_api/errors/not_found.rb
         
     | 
| 
      
 117 
     | 
    
         
            +
            - lib/slack_api/errors/response.rb
         
     | 
| 
      
 118 
     | 
    
         
            +
            - lib/slack_api/slack_api.rb
         
     | 
| 
      
 119 
     | 
    
         
            +
            - lib/slack_neuralyzer.rb
         
     | 
| 
      
 120 
     | 
    
         
            +
            - lib/slack_neuralyzer/args_parser.rb
         
     | 
| 
      
 121 
     | 
    
         
            +
            - lib/slack_neuralyzer/cleaner/base.rb
         
     | 
| 
      
 122 
     | 
    
         
            +
            - lib/slack_neuralyzer/cleaner/files.rb
         
     | 
| 
      
 123 
     | 
    
         
            +
            - lib/slack_neuralyzer/cleaner/messages.rb
         
     | 
| 
      
 124 
     | 
    
         
            +
            - lib/slack_neuralyzer/cli.rb
         
     | 
| 
      
 125 
     | 
    
         
            +
            - lib/slack_neuralyzer/colorizable.rb
         
     | 
| 
      
 126 
     | 
    
         
            +
            - lib/slack_neuralyzer/dict.rb
         
     | 
| 
      
 127 
     | 
    
         
            +
            - lib/slack_neuralyzer/errors/mutually_exclusive_arguments.rb
         
     | 
| 
      
 128 
     | 
    
         
            +
            - lib/slack_neuralyzer/errors/required_arguments.rb
         
     | 
| 
      
 129 
     | 
    
         
            +
            - lib/slack_neuralyzer/helper.rb
         
     | 
| 
      
 130 
     | 
    
         
            +
            - lib/slack_neuralyzer/logger.rb
         
     | 
| 
      
 131 
     | 
    
         
            +
            - lib/slack_neuralyzer/multi_io.rb
         
     | 
| 
      
 132 
     | 
    
         
            +
            - lib/slack_neuralyzer/version.rb
         
     | 
| 
      
 133 
     | 
    
         
            +
            - screenshots/general_test_token.png
         
     | 
| 
      
 134 
     | 
    
         
            +
            - screenshots/neuralyzer.gif
         
     | 
| 
      
 135 
     | 
    
         
            +
            - screenshots/slack_neuralyzer_demo.gif
         
     | 
| 
      
 136 
     | 
    
         
            +
            - slack_neuralyzer.gemspec
         
     | 
| 
      
 137 
     | 
    
         
            +
            homepage: https://github.com/mgleon08/slack_neuralyzer
         
     | 
| 
      
 138 
     | 
    
         
            +
            licenses:
         
     | 
| 
      
 139 
     | 
    
         
            +
            - MIT
         
     | 
| 
      
 140 
     | 
    
         
            +
            metadata: {}
         
     | 
| 
      
 141 
     | 
    
         
            +
            post_install_message: 
         
     | 
| 
      
 142 
     | 
    
         
            +
            rdoc_options: []
         
     | 
| 
      
 143 
     | 
    
         
            +
            require_paths:
         
     | 
| 
      
 144 
     | 
    
         
            +
            - lib
         
     | 
| 
      
 145 
     | 
    
         
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 146 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 147 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 148 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 149 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 150 
     | 
    
         
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 151 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 152 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 153 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 154 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 155 
     | 
    
         
            +
            requirements: []
         
     | 
| 
      
 156 
     | 
    
         
            +
            rubyforge_project: 
         
     | 
| 
      
 157 
     | 
    
         
            +
            rubygems_version: 2.4.8
         
     | 
| 
      
 158 
     | 
    
         
            +
            signing_key: 
         
     | 
| 
      
 159 
     | 
    
         
            +
            specification_version: 4
         
     | 
| 
      
 160 
     | 
    
         
            +
            summary: The easiest way to clean up messages and files on Slack.
         
     | 
| 
      
 161 
     | 
    
         
            +
            test_files: []
         
     |