slack-smart-bot 1.9.1 → 1.11.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 +4 -4
- data/README.md +184 -16
- data/lib/slack/smart-bot/comm/ask.rb +55 -49
- data/lib/slack/smart-bot/comm/delete.rb +13 -0
- data/lib/slack/smart-bot/comm/dont_understand.rb +3 -3
- data/lib/slack/smart-bot/comm/event_hello.rb +8 -4
- data/lib/slack/smart-bot/comm/get_channel_members.rb +13 -4
- data/lib/slack/smart-bot/comm/get_channels.rb +31 -16
- data/lib/slack/smart-bot/comm/get_presence.rb +20 -0
- data/lib/slack/smart-bot/comm/get_user_info.rb +12 -8
- data/lib/slack/smart-bot/comm/get_users.rb +24 -0
- data/lib/slack/smart-bot/comm/react.rb +19 -2
- data/lib/slack/smart-bot/comm/respond.rb +224 -53
- data/lib/slack/smart-bot/comm/respond_direct.rb +2 -3
- data/lib/slack/smart-bot/comm/respond_thread.rb +5 -0
- data/lib/slack/smart-bot/comm/send_file.rb +38 -34
- data/lib/slack/smart-bot/comm/send_msg_channel.rb +27 -22
- data/lib/slack/smart-bot/comm/send_msg_user.rb +59 -33
- data/lib/slack/smart-bot/comm/unreact.rb +22 -18
- data/lib/slack/smart-bot/comm.rb +4 -0
- data/lib/slack/smart-bot/commands/general/add_admin.rb +51 -0
- data/lib/slack/smart-bot/commands/general/add_announcement.rb +32 -0
- data/lib/slack/smart-bot/commands/general/add_team.rb +80 -0
- data/lib/slack/smart-bot/commands/general/allow_access.rb +67 -0
- data/lib/slack/smart-bot/commands/general/bot_help.rb +69 -33
- data/lib/slack/smart-bot/commands/general/bye_bot.rb +0 -7
- data/lib/slack/smart-bot/commands/general/delete_announcement.rb +34 -0
- data/lib/slack/smart-bot/commands/general/delete_share.rb +34 -0
- data/lib/slack/smart-bot/commands/general/delete_team.rb +34 -0
- data/lib/slack/smart-bot/commands/general/deny_access.rb +36 -0
- data/lib/slack/smart-bot/commands/general/hi_bot.rb +16 -11
- data/lib/slack/smart-bot/commands/general/ping_team.rb +100 -0
- data/lib/slack/smart-bot/commands/general/poster.rb +116 -0
- data/lib/slack/smart-bot/commands/general/remove_admin.rb +58 -0
- data/lib/slack/smart-bot/commands/general/see_access.rb +24 -0
- data/lib/slack/smart-bot/commands/general/see_admins.rb +33 -0
- data/lib/slack/smart-bot/commands/general/see_announcements.rb +115 -0
- data/lib/slack/smart-bot/commands/general/see_command_ids.rb +29 -0
- data/lib/slack/smart-bot/commands/general/see_favorite_commands.rb +53 -0
- data/lib/slack/smart-bot/commands/general/see_shares.rb +41 -0
- data/lib/slack/smart-bot/commands/general/see_statuses.rb +91 -0
- data/lib/slack/smart-bot/commands/general/see_teams.rb +252 -0
- data/lib/slack/smart-bot/commands/general/share_messages.rb +58 -0
- data/lib/slack/smart-bot/commands/general/update_team.rb +109 -0
- data/lib/slack/smart-bot/commands/general_bot_commands.rb +504 -0
- data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +4 -6
- data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +45 -14
- data/lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb +4 -1
- data/lib/slack/smart-bot/commands/on_bot/admin/pause_bot.rb +6 -3
- data/lib/slack/smart-bot/commands/on_bot/admin/pause_routine.rb +3 -1
- data/lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb +4 -4
- data/lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb +8 -2
- data/lib/slack/smart-bot/commands/on_bot/admin/see_result_routine.rb +33 -0
- data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +13 -10
- data/lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb +6 -3
- data/lib/slack/smart-bot/commands/on_bot/admin/start_routine.rb +3 -1
- data/lib/slack/smart-bot/commands/on_bot/admin/stop_using_rules_on.rb +4 -1
- data/lib/slack/smart-bot/commands/on_bot/admin_master/delete_message.rb +25 -0
- data/lib/slack/smart-bot/commands/on_bot/admin_master/get_bot_logs.rb +1 -0
- data/lib/slack/smart-bot/commands/on_bot/admin_master/react_to.rb +34 -0
- data/lib/slack/smart-bot/commands/on_bot/admin_master/send_message.rb +37 -0
- data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +4 -5
- data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +7 -8
- data/lib/slack/smart-bot/commands/on_bot/general/bot_stats.rb +400 -0
- data/lib/slack/smart-bot/commands/{general → on_bot/general}/bot_status.rb +3 -4
- data/lib/slack/smart-bot/commands/on_bot/general/leaderboard.rb +201 -0
- data/lib/slack/smart-bot/commands/{general → on_bot/general}/stop_using_rules.rb +12 -6
- data/lib/slack/smart-bot/commands/on_bot/general/suggest_command.rb +36 -0
- data/lib/slack/smart-bot/commands/{general → on_bot/general}/use_rules.rb +13 -11
- data/lib/slack/smart-bot/commands/{general → on_bot/general}/whats_new.rb +2 -1
- data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +4 -5
- data/lib/slack/smart-bot/commands/on_bot/repl.rb +76 -21
- data/lib/slack/smart-bot/commands/on_bot/ruby_code.rb +3 -4
- data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +15 -7
- data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +5 -6
- data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +5 -6
- data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +45 -12
- data/lib/slack/smart-bot/commands/on_master/admin/kill_bot_on_channel.rb +7 -3
- data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +4 -1
- data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +3 -1
- data/lib/slack/smart-bot/commands/on_master/admin_master/publish_announcements.rb +33 -0
- data/lib/slack/smart-bot/commands/on_master/admin_master/set_general_message.rb +39 -0
- data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +10 -1
- data/lib/slack/smart-bot/commands/on_master/create_bot.rb +28 -14
- data/lib/slack/smart-bot/commands/on_master/where_smartbot.rb +41 -0
- data/lib/slack/smart-bot/commands.rb +36 -5
- data/lib/slack/smart-bot/listen.rb +31 -33
- data/lib/slack/smart-bot/process.rb +234 -73
- data/lib/slack/smart-bot/process_first.rb +119 -38
- data/lib/slack/smart-bot/treat_message.rb +310 -237
- data/lib/slack/smart-bot/utils/build_help.rb +2 -2
- data/lib/slack/smart-bot/utils/create_routine_thread.rb +81 -46
- data/lib/slack/smart-bot/utils/get_access_channels.rb +13 -0
- data/lib/slack/smart-bot/utils/get_admins_channels.rb +13 -0
- data/lib/slack/smart-bot/utils/get_bots_created.rb +28 -8
- data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +7 -2
- data/lib/slack/smart-bot/utils/get_command_ids.rb +84 -0
- data/lib/slack/smart-bot/utils/get_help.rb +79 -73
- data/lib/slack/smart-bot/utils/get_repls.rb +22 -2
- data/lib/slack/smart-bot/utils/get_routines.rb +22 -2
- data/lib/slack/smart-bot/utils/get_shares.rb +12 -0
- data/lib/slack/smart-bot/utils/get_teams.rb +22 -0
- data/lib/slack/smart-bot/utils/has_access.rb +28 -0
- data/lib/slack/smart-bot/utils/is_admin.rb +27 -0
- data/lib/slack/smart-bot/utils/save_stats.rb +46 -41
- data/lib/slack/smart-bot/utils/save_status.rb +67 -0
- data/lib/slack/smart-bot/utils/update_access_channels.rb +8 -0
- data/lib/slack/smart-bot/utils/update_admins_channels.rb +8 -0
- data/lib/slack/smart-bot/utils/update_bots_file.rb +28 -7
- data/lib/slack/smart-bot/utils/update_repls.rb +7 -4
- data/lib/slack/smart-bot/utils/update_routines.rb +9 -3
- data/lib/slack/smart-bot/utils/update_shortcuts_file.rb +13 -6
- data/lib/slack/smart-bot/utils/update_teams.rb +16 -0
- data/lib/slack/smart-bot/utils.rb +11 -0
- data/lib/slack-smart-bot.rb +72 -12
- data/lib/slack-smart-bot_general_commands.rb +61 -0
- data/lib/slack-smart-bot_general_rules.rb +5 -2
- data/lib/slack-smart-bot_rules.rb +43 -17
- data/whats_new.txt +20 -15
- metadata +76 -9
- data/lib/slack/smart-bot/commands/general/bot_stats.rb +0 -313
| @@ -3,27 +3,31 @@ class SlackSmartBot | |
| 3 3 | 
             
              # unreact(:thumbsup)
         | 
| 4 4 | 
             
              # ts: can be true, false or a specific ts
         | 
| 5 5 | 
             
              def unreact(emoji, ts=false)
         | 
| 6 | 
            -
                 | 
| 7 | 
            -
                   | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
                  parent = false
         | 
| 11 | 
            -
                end
         | 
| 12 | 
            -
                if ts.nil?
         | 
| 13 | 
            -
                  if parent or Thread.current[:ts].to_s == ''
         | 
| 14 | 
            -
                    ts = Thread.current[:thread_ts]
         | 
| 6 | 
            +
                begin
         | 
| 7 | 
            +
                  if ts.is_a?(TrueClass) or ts.is_a?(FalseClass)
         | 
| 8 | 
            +
                    parent = ts
         | 
| 9 | 
            +
                    ts = nil
         | 
| 15 10 | 
             
                  else
         | 
| 16 | 
            -
                     | 
| 11 | 
            +
                    parent = false
         | 
| 17 12 | 
             
                  end
         | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
                     | 
| 24 | 
            -
                   | 
| 25 | 
            -
             | 
| 13 | 
            +
                  if ts.nil?
         | 
| 14 | 
            +
                    if parent or Thread.current[:ts].to_s == ''
         | 
| 15 | 
            +
                      ts = Thread.current[:thread_ts]
         | 
| 16 | 
            +
                    else
         | 
| 17 | 
            +
                      ts = Thread.current[:ts]
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                  if ts.nil?
         | 
| 21 | 
            +
                    @logger.warn 'unreact method no ts supplied'
         | 
| 22 | 
            +
                  else
         | 
| 23 | 
            +
                    begin
         | 
| 24 | 
            +
                      client.web_client.reactions_remove(channel: Thread.current[:dest], name: emoji, timestamp: ts) unless config.simulate
         | 
| 25 | 
            +
                    rescue Exception => stack
         | 
| 26 | 
            +
                      @logger.warn stack
         | 
| 27 | 
            +
                    end
         | 
| 26 28 | 
             
                  end
         | 
| 29 | 
            +
                rescue Exception => stack
         | 
| 30 | 
            +
                  @logger.warn stack
         | 
| 27 31 | 
             
                end
         | 
| 28 32 | 
             
              end
         | 
| 29 33 | 
             
            end
         | 
    
        data/lib/slack/smart-bot/comm.rb
    CHANGED
    
    | @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            require_relative 'comm/ask'
         | 
| 2 2 | 
             
            require_relative 'comm/dont_understand'
         | 
| 3 | 
            +
            require_relative 'comm/respond_thread'
         | 
| 3 4 | 
             
            require_relative 'comm/respond_direct'
         | 
| 4 5 | 
             
            require_relative 'comm/respond'
         | 
| 5 6 | 
             
            require_relative 'comm/send_file'
         | 
| @@ -8,6 +9,9 @@ require_relative 'comm/send_msg_user' | |
| 8 9 | 
             
            require_relative 'comm/react'
         | 
| 9 10 | 
             
            require_relative 'comm/unreact'
         | 
| 10 11 | 
             
            require_relative 'comm/get_user_info'
         | 
| 12 | 
            +
            require_relative 'comm/get_users'
         | 
| 11 13 | 
             
            require_relative 'comm/event_hello'
         | 
| 12 14 | 
             
            require_relative 'comm/get_channel_members'
         | 
| 13 15 | 
             
            require_relative 'comm/get_channels'
         | 
| 16 | 
            +
            require_relative 'comm/delete'
         | 
| 17 | 
            +
            require_relative 'comm/get_presence'
         | 
| @@ -0,0 +1,51 @@ | |
| 1 | 
            +
            class SlackSmartBot
         | 
| 2 | 
            +
              def add_admin(user, admin_user)
         | 
| 3 | 
            +
                save_stats(__method__)
         | 
| 4 | 
            +
                if Thread.current[:dest][0]=='D'
         | 
| 5 | 
            +
                  respond "This command cannot be called from a DM"
         | 
| 6 | 
            +
                else
         | 
| 7 | 
            +
                  if Thread.current[:typem] == :on_call
         | 
| 8 | 
            +
                    channel = Thread.current[:dchannel]
         | 
| 9 | 
            +
                  elsif Thread.current[:using_channel].to_s==''
         | 
| 10 | 
            +
                    channel = Thread.current[:dest]
         | 
| 11 | 
            +
                  else
         | 
| 12 | 
            +
                    channel = Thread.current[:using_channel]
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
                  messages = []
         | 
| 15 | 
            +
                  admins = config.masters.dup
         | 
| 16 | 
            +
                  channels = get_channels()
         | 
| 17 | 
            +
                  channel_found = channels.detect { |c| c.id == channel }
         | 
| 18 | 
            +
                  if !channel_found.nil? and channel_found.creator.to_s != ''
         | 
| 19 | 
            +
                    creator_info = @users.select{|u| u.id == channel_found.creator or (u.key?(:enterprise_user) and u.enterprise_user.id == channel_found.creator)}[-1]
         | 
| 20 | 
            +
                    admins << creator_info.name
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                  if Thread.current[:typem] == :on_bot or Thread.current[:typem] == :on_master
         | 
| 23 | 
            +
                    admins << config.admins.dup
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                  if @admins_channels.key?(channel) and @admins_channels[channel].size > 0
         | 
| 26 | 
            +
                    admins << @admins_channels[channel]
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                  admins.flatten!
         | 
| 29 | 
            +
                  admins.uniq!
         | 
| 30 | 
            +
                  admins.delete(nil)
         | 
| 31 | 
            +
                  if admins.include?(user.name)
         | 
| 32 | 
            +
                    admin_info = @users.select{|u| u.id == admin_user or (u.key?(:enterprise_user) and u.enterprise_user.id == admin_user)}[-1]
         | 
| 33 | 
            +
                    if admins.include?(admin_info.name)
         | 
| 34 | 
            +
                      messages << "This user is already an admin of this channel."
         | 
| 35 | 
            +
                    else
         | 
| 36 | 
            +
                      @admins_channels[channel] ||= []
         | 
| 37 | 
            +
                      @admins_channels[channel] << admin_info.name
         | 
| 38 | 
            +
                      update_admins_channels()
         | 
| 39 | 
            +
                      messages << "The user is an admin of this channel from now on."
         | 
| 40 | 
            +
                      admins << admin_info.name
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
                    messages << "*Admins*: <@#{admins.join('>, <@')}>"
         | 
| 43 | 
            +
                  else
         | 
| 44 | 
            +
                    messages << "Only the creator of the channel, Master admins or admins can add a new admin for this channel."
         | 
| 45 | 
            +
                    messages << "*Admins*: <@#{admins.join('>, <@')}>"
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  respond messages.join("\n")
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
            end
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            class SlackSmartBot
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              def add_announcement(user, type, message)
         | 
| 4 | 
            +
                save_stats(__method__)
         | 
| 5 | 
            +
                if has_access?(__method__, user)
         | 
| 6 | 
            +
                  if Thread.current[:typem] == :on_call
         | 
| 7 | 
            +
                    channel = Thread.current[:dchannel]
         | 
| 8 | 
            +
                  else
         | 
| 9 | 
            +
                    channel = Thread.current[:dest]
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                  if File.exist?("#{config.path}/announcements/#{channel}.csv") and !@announcements.key?(channel)
         | 
| 12 | 
            +
                    t = CSV.table("#{config.path}/announcements/#{channel}.csv", headers: ['message_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'message'])
         | 
| 13 | 
            +
                    @announcements[channel] = t
         | 
| 14 | 
            +
                    num = t[:message_id].max + 1
         | 
| 15 | 
            +
                  elsif !@announcements.key?(channel)
         | 
| 16 | 
            +
                    File.open("#{config.path}/announcements/#{channel}.csv","w")
         | 
| 17 | 
            +
                    t = CSV.table("#{config.path}/announcements/#{channel}.csv", headers: ['message_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'message'])
         | 
| 18 | 
            +
                    num = 1
         | 
| 19 | 
            +
                    @announcements[channel] = t
         | 
| 20 | 
            +
                  else
         | 
| 21 | 
            +
                    num = @announcements[channel][:message_id].max + 1
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                  values = [num, '', user.name, Time.now.strftime("%Y/%m/%d"), Time.now.strftime("%H:%M"), type, message]
         | 
| 24 | 
            +
                  @announcements[channel] << values
         | 
| 25 | 
            +
                  CSV.open("#{config.path}/announcements/#{channel}.csv", "a+") do |csv|
         | 
| 26 | 
            +
                    csv << values
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                  respond "The announcement has been added. (id: #{num}).\nRelated commands `see announcements`, `delete announcement ID`"
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
| @@ -0,0 +1,80 @@ | |
| 1 | 
            +
            class SlackSmartBot
         | 
| 2 | 
            +
              def add_team(user, name, options, info)
         | 
| 3 | 
            +
                save_stats(__method__)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                get_teams()
         | 
| 6 | 
            +
                if @teams.key?(name.to_sym)
         | 
| 7 | 
            +
                  respond "It seems like the team *#{name}* already exists.\nRelated commands `update team TEAM_NAME PROPERTIES`, `delete team TEAM_NAME`, `see team TEAM_NAME`, `see teams`"
         | 
| 8 | 
            +
                else
         | 
| 9 | 
            +
                  wrong = false
         | 
| 10 | 
            +
                  team = { members: {}, channels: {} }
         | 
| 11 | 
            +
                  last_type = nil
         | 
| 12 | 
            +
                  type_detected = false
         | 
| 13 | 
            +
                  options.split(/\s+/).each do |opt|
         | 
| 14 | 
            +
                    type_detected = false
         | 
| 15 | 
            +
                    if opt.match?(/^\s*$/)
         | 
| 16 | 
            +
                      #blank
         | 
| 17 | 
            +
                    elsif opt.match?(/^[\w\-]+$/i)
         | 
| 18 | 
            +
                      last_type = opt
         | 
| 19 | 
            +
                      type_detected = true
         | 
| 20 | 
            +
                    elsif opt.match(/<@(\w+)>/i)
         | 
| 21 | 
            +
                      team[:members][last_type] ||= []
         | 
| 22 | 
            +
                      if last_type.nil?
         | 
| 23 | 
            +
                        wrong = true
         | 
| 24 | 
            +
                        respond "You need to specify the TYPE for the member."
         | 
| 25 | 
            +
                        break
         | 
| 26 | 
            +
                      else
         | 
| 27 | 
            +
                        member_id = $1
         | 
| 28 | 
            +
                        member_info = @users.select { |u| u.id == member_id or (u.key?(:enterprise_user) and u.enterprise_user.id == member_id) }[-1]
         | 
| 29 | 
            +
                        if member_info.nil?
         | 
| 30 | 
            +
                          @users = get_users()
         | 
| 31 | 
            +
                          member_info = @users.select { |u| u.id == member_id or (u.key?(:enterprise_user) and u.enterprise_user.id == member_id) }[-1]
         | 
| 32 | 
            +
                        end
         | 
| 33 | 
            +
                        team[:members][last_type] << member_info.name
         | 
| 34 | 
            +
                      end
         | 
| 35 | 
            +
                    elsif opt.match(/<#(\w+)\|[^>]*>/i)
         | 
| 36 | 
            +
                      team[:channels][last_type] ||= []
         | 
| 37 | 
            +
                      if last_type.nil?
         | 
| 38 | 
            +
                        wrong = true
         | 
| 39 | 
            +
                        respond "You need to specify the TYPE for the channel."
         | 
| 40 | 
            +
                        break
         | 
| 41 | 
            +
                      else
         | 
| 42 | 
            +
                        channel_id = $1
         | 
| 43 | 
            +
                        get_channels_name_and_id() unless @channels_name.keys.include?(channel_id)
         | 
| 44 | 
            +
                        channel = @channels_name[channel_id]
         | 
| 45 | 
            +
                        channel_members = get_channel_members(channel_id) unless channel.nil?
         | 
| 46 | 
            +
                        if channel.nil? or !channel_members.include?(config.nick_id)
         | 
| 47 | 
            +
                          respond ":exclamation: Add the Smart Bot to *<##{channel_id}>* channel first."
         | 
| 48 | 
            +
                          wrong = true
         | 
| 49 | 
            +
                          break
         | 
| 50 | 
            +
                        else
         | 
| 51 | 
            +
                          team[:channels][last_type] << channel
         | 
| 52 | 
            +
                        end
         | 
| 53 | 
            +
                      end
         | 
| 54 | 
            +
                    else
         | 
| 55 | 
            +
                      respond "It seems like the members or channel list is not correct. Please double check."
         | 
| 56 | 
            +
                      wrong = true
         | 
| 57 | 
            +
                      break
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
                  if type_detected #type added but not added a channel or user
         | 
| 61 | 
            +
                    respond "It seems like the parameters supplied are not correct. Please double check."
         | 
| 62 | 
            +
                    wrong = true
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  unless wrong
         | 
| 66 | 
            +
                    get_teams()
         | 
| 67 | 
            +
                    team[:info] = info
         | 
| 68 | 
            +
                    team[:status] = :added
         | 
| 69 | 
            +
                    team[:user] = user.name
         | 
| 70 | 
            +
                    team[:creator] = user.name
         | 
| 71 | 
            +
                    team[:date] = Time.now.strftime("%Y-%m-%dT%H:%M:%S.000Z")[0..18]
         | 
| 72 | 
            +
                    new_team = {}
         | 
| 73 | 
            +
                    new_team[name.to_sym] = team
         | 
| 74 | 
            +
                    update_teams(new_team)
         | 
| 75 | 
            +
                    respond "The *#{name}* team has been added."
         | 
| 76 | 
            +
                    see_teams(user, name, add_stats: false)
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
            end
         | 
| @@ -0,0 +1,67 @@ | |
| 1 | 
            +
            class SlackSmartBot
         | 
| 2 | 
            +
              def allow_access(user, command_id, opt)
         | 
| 3 | 
            +
                save_stats(__method__)
         | 
| 4 | 
            +
                not_allowed = ["hi_bot", "bye_bot", "allow_access", "deny_access", "get_bot_logs", "add_routine", "pause_bot", "pause_routine", "remove_routine", "run_routine", "start_bot",
         | 
| 5 | 
            +
                               "start_routine", "delete_message", "send_message", "kill_bot_on_channel", "exit_bot", "notify_message", "publish_announcements", "set_general_message",
         | 
| 6 | 
            +
                               "set_maintenance", "bot_help", "bot_rules"]
         | 
| 7 | 
            +
                if !is_admin?(user.name)
         | 
| 8 | 
            +
                  respond "Only admins of this channel can use this command. Take a look who is an admin of this channel by calling `see admins`"
         | 
| 9 | 
            +
                elsif Thread.current[:dest][0] == "D"
         | 
| 10 | 
            +
                  respond "This command cannot be called from a DM"
         | 
| 11 | 
            +
                elsif not_allowed.include?(command_id)
         | 
| 12 | 
            +
                  respond "Sorry but the access for `#{command_id}` cannot be changed."
         | 
| 13 | 
            +
                else
         | 
| 14 | 
            +
                  if Thread.current[:typem] == :on_call
         | 
| 15 | 
            +
                    channel = Thread.current[:dchannel]
         | 
| 16 | 
            +
                  elsif Thread.current[:using_channel].to_s == ""
         | 
| 17 | 
            +
                    channel = Thread.current[:dest]
         | 
| 18 | 
            +
                  else
         | 
| 19 | 
            +
                    channel = Thread.current[:using_channel]
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                  command_ids = get_command_ids()
         | 
| 22 | 
            +
                  if command_ids.values.flatten.include?(command_id)
         | 
| 23 | 
            +
                    wrong_user = false
         | 
| 24 | 
            +
                    access_users = []
         | 
| 25 | 
            +
                    opt.each do |o|
         | 
| 26 | 
            +
                      if o.match(/\A\s*<@([^>]+)>\s*\z/)
         | 
| 27 | 
            +
                        access_users << $1
         | 
| 28 | 
            +
                      else
         | 
| 29 | 
            +
                        respond "Hmm, I've done some research on this and it looks like #{o} is not a valid Slack user.\nMake sure you are writing @USER and it is recognized by *Slack*\n"
         | 
| 30 | 
            +
                        wrong_user = true
         | 
| 31 | 
            +
                        break
         | 
| 32 | 
            +
                      end
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
                    unless wrong_user
         | 
| 35 | 
            +
                      if !@access_channels.key?(channel)
         | 
| 36 | 
            +
                        @access_channels[channel] = {}
         | 
| 37 | 
            +
                      end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                      if access_users.empty? # all users will be able to access
         | 
| 40 | 
            +
                        @access_channels[channel].delete(command_id)
         | 
| 41 | 
            +
                      else
         | 
| 42 | 
            +
                        if @access_channels.key?(channel) and !@access_channels[channel].key?(command_id)
         | 
| 43 | 
            +
                          @access_channels[channel][command_id] = []
         | 
| 44 | 
            +
                        end
         | 
| 45 | 
            +
                        access_users_names = []
         | 
| 46 | 
            +
                        access_users.each do |us|
         | 
| 47 | 
            +
                          user_info = @users.select { |u| u.id == us or (u.key?(:enterprise_user) and u.enterprise_user.id == us) }[-1]
         | 
| 48 | 
            +
                          access_users_names << user_info.name unless user_info.nil?
         | 
| 49 | 
            +
                        end
         | 
| 50 | 
            +
                        @access_channels[channel][command_id] += access_users_names
         | 
| 51 | 
            +
                        @access_channels[channel][command_id].flatten!
         | 
| 52 | 
            +
                        @access_channels[channel][command_id].uniq!
         | 
| 53 | 
            +
                        @access_channels[channel][command_id].delete(nil)
         | 
| 54 | 
            +
                      end
         | 
| 55 | 
            +
                      update_access_channels()
         | 
| 56 | 
            +
                      if !@access_channels[channel].key?(command_id)
         | 
| 57 | 
            +
                        respond "All users will have access to this command on this channel."
         | 
| 58 | 
            +
                      else
         | 
| 59 | 
            +
                        respond "These users will have access to this command on this channel: <@#{@access_channels[channel][command_id].join(">, <@")}>"
         | 
| 60 | 
            +
                      end
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
                  else
         | 
| 63 | 
            +
                    respond "It seems like #{command_id} is not valid. Please be sure that exists by calling `see command ids`"
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
            end
         | 
| @@ -1,24 +1,9 @@ | |
| 1 1 | 
             
            class SlackSmartBot
         | 
| 2 2 |  | 
| 3 | 
            -
               | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
              # help: `bot rules COMMAND`
         | 
| 8 | 
            -
              # help: `bot help expanded`
         | 
| 9 | 
            -
              # help: `bot rules expanded`
         | 
| 10 | 
            -
              # help: `bot what can I do?`
         | 
| 11 | 
            -
              # help:    it will display this help. For a more detailed help call `bot help expanded` or `bot rules expanded`.
         | 
| 12 | 
            -
              # help:    if COMMAND supplied just help for that command
         | 
| 13 | 
            -
              # help:    you can use the option 'expanded' or the alias 'extended'
         | 
| 14 | 
            -
              # help:    `bot rules` will show only the specific rules for this channel.
         | 
| 15 | 
            -
              # help:
         | 
| 16 | 
            -
              def bot_help(user, from, dest, dchannel, specific, help_command, rules_file)
         | 
| 17 | 
            -
                save_stats(__method__)
         | 
| 18 | 
            -
                if config[:allow_access].key?(__method__) and !config[:allow_access][__method__].include?(user.name) and !config[:allow_access][__method__].include?(user.id) and 
         | 
| 19 | 
            -
                  (!user.key?(:enterprise_user) or ( user.key?(:enterprise_user) and !config[:allow_access][__method__].include?(user[:enterprise_user].id)))
         | 
| 20 | 
            -
                  respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
         | 
| 21 | 
            -
                else
         | 
| 3 | 
            +
              def bot_help(user, from, dest, dchannel, specific, help_command, rules_file, savestats: true, strict: false)
         | 
| 4 | 
            +
                save_stats(__method__) if savestats
         | 
| 5 | 
            +
                output = []
         | 
| 6 | 
            +
                if has_access?(__method__, user)
         | 
| 22 7 | 
             
                  help_found = false
         | 
| 23 8 |  | 
| 24 9 | 
             
                  message = ""
         | 
| @@ -28,36 +13,74 @@ class SlackSmartBot | |
| 28 13 | 
             
                    message_not_expanded = ''
         | 
| 29 14 | 
             
                  else
         | 
| 30 15 | 
             
                    expanded = false
         | 
| 31 | 
            -
                    message_not_expanded = " | 
| 32 | 
            -
                    message_not_expanded += " | 
| 16 | 
            +
                    message_not_expanded = "If you want to see the *expanded* version of *`bot help`* or *`bot rules`*, please call *`bot help expanded`* or *`bot rules expanded`*\n"
         | 
| 17 | 
            +
                    message_not_expanded += "Also to get specific *expanded* help for a specific command or rule call *`bot help COMMAND`*\n"
         | 
| 33 18 | 
             
                  end
         | 
| 34 | 
            -
             | 
| 35 19 | 
             
                  help_message = get_help(rules_file, dest, from, specific, expanded)
         | 
| 36 | 
            -
             | 
| 20 | 
            +
                  commands = []
         | 
| 21 | 
            +
                  commands_search = []
         | 
| 37 22 | 
             
                  if help_command.to_s != ""
         | 
| 38 23 | 
             
                    help_message.gsub(/====+/,'-'*30).split(/^\s*-------*$/).each do |h|
         | 
| 39 | 
            -
                      if  | 
| 40 | 
            -
                         | 
| 41 | 
            -
             | 
| 24 | 
            +
                      if strict
         | 
| 25 | 
            +
                        if h.match?(/`#{help_command}`/i) or h.match?(/^\s*command_id:\s+:#{help_command.gsub(' ', '_')}\s*$/)
         | 
| 26 | 
            +
                          output << h
         | 
| 27 | 
            +
                          help_found = true
         | 
| 28 | 
            +
                          commands << h
         | 
| 29 | 
            +
                          break
         | 
| 30 | 
            +
                        end
         | 
| 31 | 
            +
                      else
         | 
| 32 | 
            +
                        if h.match?(/[`_]#{help_command}/i) or h.match?(/^\s*command_id:\s+:#{help_command.gsub(' ', '_')}\s*$/)
         | 
| 33 | 
            +
                          output << h
         | 
| 34 | 
            +
                          help_found = true
         | 
| 35 | 
            +
                          commands << h
         | 
| 36 | 
            +
                        elsif !h.match?(/\A\s*\*/) and !h.match?(/\A\s*=+/) #to avoid general messages for bot help *General commands...*
         | 
| 37 | 
            +
                          all_found = true
         | 
| 38 | 
            +
                          help_command.to_s.split(' ') do |hc|
         | 
| 39 | 
            +
                            unless hc.match?(/^\s*\z/)
         | 
| 40 | 
            +
                              if !h.match?(/#{hc}/i)
         | 
| 41 | 
            +
                                all_found = false                  
         | 
| 42 | 
            +
                              end
         | 
| 43 | 
            +
                            end
         | 
| 44 | 
            +
                          end
         | 
| 45 | 
            +
                        end
         | 
| 46 | 
            +
                        commands_search << h if all_found
         | 
| 42 47 | 
             
                      end
         | 
| 43 48 | 
             
                    end
         | 
| 44 49 | 
             
                  else
         | 
| 45 50 | 
             
                    if Thread.current[:using_channel]!=''
         | 
| 46 51 | 
             
                      message += "*You are using rules from another channel: <##{Thread.current[:using_channel]}>. These are the specific commands for that channel:*"
         | 
| 47 52 | 
             
                    end
         | 
| 48 | 
            -
                     | 
| 53 | 
            +
                    output << message
         | 
| 49 54 | 
             
                  end
         | 
| 50 55 |  | 
| 51 56 | 
             
                  if (help_command.to_s == "")
         | 
| 52 57 | 
             
                    help_message.split(/^\s*=========*$/).each do |h|
         | 
| 53 | 
            -
                       | 
| 58 | 
            +
                      unless h.match?(/\A\s*\z/)
         | 
| 59 | 
            +
                        output << "#{"=" * 35}\n#{h}"
         | 
| 60 | 
            +
                      end
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
                    if Thread.current[:typem] == :on_pg or Thread.current[:typem] == :on_pub
         | 
| 63 | 
            +
                      if @bots_created.size>0
         | 
| 64 | 
            +
                        txt = "\nThese are the *SmartBots* running on this Slack workspace: *<##{@master_bot_id}>, <##{@bots_created.keys.join('>, <#')}>*\n"
         | 
| 65 | 
            +
                        txt += "Join one channel and call *`bot rules`* to see specific commands for that channel or *`bot help`* to see all commands for that channel.\n"
         | 
| 66 | 
            +
                        output << txt
         | 
| 67 | 
            +
                      end
         | 
| 54 68 | 
             
                    end
         | 
| 55 69 | 
             
                  else
         | 
| 70 | 
            +
                    if commands.size < 10 and help_command.to_s!='' and commands_search.size > 0
         | 
| 71 | 
            +
                      commands_search.shuffle!
         | 
| 72 | 
            +
                      (10-commands.size).times do |n|
         | 
| 73 | 
            +
                        unless commands_search[n].nil?
         | 
| 74 | 
            +
                          output << commands_search[n]
         | 
| 75 | 
            +
                          help_found = true
         | 
| 76 | 
            +
                        end
         | 
| 77 | 
            +
                      end
         | 
| 78 | 
            +
                    end
         | 
| 56 79 | 
             
                    unless help_found
         | 
| 57 80 | 
             
                      if specific
         | 
| 58 | 
            -
                         | 
| 81 | 
            +
                        output << "I didn't find any rule with `#{help_command}`"
         | 
| 59 82 | 
             
                      else
         | 
| 60 | 
            -
                         | 
| 83 | 
            +
                        output << "I didn't find any command with `#{help_command}`"
         | 
| 61 84 | 
             
                      end
         | 
| 62 85 | 
             
                    end
         | 
| 63 86 | 
             
                  end
         | 
| @@ -69,7 +92,7 @@ class SlackSmartBot | |
| 69 92 | 
             
                      end
         | 
| 70 93 | 
             
                    end
         | 
| 71 94 | 
             
                    if defined?(git_project) && (git_project.to_s != "") && (help_command.to_s == "")
         | 
| 72 | 
            -
                       | 
| 95 | 
            +
                      output << "Git project: #{git_project}"
         | 
| 73 96 | 
             
                    else
         | 
| 74 97 | 
             
                      def git_project
         | 
| 75 98 | 
             
                        ""
         | 
| @@ -80,9 +103,22 @@ class SlackSmartBot | |
| 80 103 | 
             
                      end
         | 
| 81 104 | 
             
                    end
         | 
| 82 105 | 
             
                  elsif help_command.to_s == ""
         | 
| 83 | 
            -
                     | 
| 106 | 
            +
                    output << "Slack Smart Bot Github project: https://github.com/MarioRuiz/slack-smart-bot"
         | 
| 107 | 
            +
                  end
         | 
| 108 | 
            +
                  unless expanded
         | 
| 109 | 
            +
                    output << message_not_expanded
         | 
| 110 | 
            +
                  end
         | 
| 111 | 
            +
                end
         | 
| 112 | 
            +
                if output.join("\n").lines.count > 50 and dest[0]!='D'
         | 
| 113 | 
            +
                  dest = :on_thread
         | 
| 114 | 
            +
                  output.unshift('Since there are many lines returned the results are returned on a thread by default.')
         | 
| 115 | 
            +
                end
         | 
| 116 | 
            +
                output.each do |h|
         | 
| 117 | 
            +
                  msg = h.gsub(/^\s*command_id:\s+:\w+\s*$/,'')
         | 
| 118 | 
            +
                  unless msg.match?(/\A\s*\z/)
         | 
| 119 | 
            +
                    respond msg, dest, unfurl_links: false, unfurl_media: false
         | 
| 84 120 | 
             
                  end
         | 
| 85 | 
            -
                  respond message_not_expanded unless expanded
         | 
| 86 121 | 
             
                end
         | 
| 122 | 
            +
                return output.join("\n")
         | 
| 87 123 | 
             
              end
         | 
| 88 124 | 
             
            end
         | 
| @@ -1,12 +1,5 @@ | |
| 1 1 | 
             
            class SlackSmartBot
         | 
| 2 2 |  | 
| 3 | 
            -
              # help: ----------------------------------------------
         | 
| 4 | 
            -
              # help: `Bye Bot`
         | 
| 5 | 
            -
              # help: `Bye Smart`
         | 
| 6 | 
            -
              # help: `Bye NAME_OF_THE_BOT`
         | 
| 7 | 
            -
              # help:    Bot stops listening to you
         | 
| 8 | 
            -
              # help:    Also apart of Bye you can use _Bæ, Good Bye, Adiós, Ciao, Bless, Bless Bless, Adeu_
         | 
| 9 | 
            -
              # help:
         | 
| 10 3 | 
             
              def bye_bot(dest, from, display_name)
         | 
| 11 4 | 
             
                if @status == :on
         | 
| 12 5 | 
             
                  save_stats(__method__)
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            class SlackSmartBot
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              def delete_announcement(user, message_id)
         | 
| 4 | 
            +
                save_stats(__method__)
         | 
| 5 | 
            +
                if has_access?(__method__, user)
         | 
| 6 | 
            +
                  if Thread.current[:typem] == :on_call
         | 
| 7 | 
            +
                    channel = Thread.current[:dchannel]
         | 
| 8 | 
            +
                  else
         | 
| 9 | 
            +
                    channel = Thread.current[:dest]
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                  if File.exist?("#{config.path}/announcements/#{channel}.csv") and !@announcements.key?(channel)
         | 
| 12 | 
            +
                    t = CSV.table("#{config.path}/announcements/#{channel}.csv", headers: ['message_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'message'])
         | 
| 13 | 
            +
                    @announcements[channel] = t
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                  found = false
         | 
| 16 | 
            +
                  message = ''
         | 
| 17 | 
            +
                  if @announcements.key?(channel) and @announcements[channel][:message_id].include?(message_id.to_i)
         | 
| 18 | 
            +
                    CSV.open("#{config.path}/announcements/#{channel}.csv", "w") do |csv|
         | 
| 19 | 
            +
                      @announcements[channel].each do |row|
         | 
| 20 | 
            +
                        if row[:message_id].to_i == message_id.to_i
         | 
| 21 | 
            +
                          message = row[:message]
         | 
| 22 | 
            +
                          row[:user_deleted] = user.name
         | 
| 23 | 
            +
                        end    
         | 
| 24 | 
            +
                        csv << row
         | 
| 25 | 
            +
                      end
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                    respond "The announcement has been deleted: #{message}"
         | 
| 28 | 
            +
                  else
         | 
| 29 | 
            +
                    respond "Sorry but I didn't find the message id #{message_id}. Call `see announcements` to see the ids."
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            class SlackSmartBot
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              def delete_share(user, share_id)
         | 
| 4 | 
            +
                save_stats(__method__)
         | 
| 5 | 
            +
                if has_access?(__method__, user)
         | 
| 6 | 
            +
                  if Thread.current[:typem] == :on_call
         | 
| 7 | 
            +
                    channel = Thread.current[:dchannel]
         | 
| 8 | 
            +
                  else
         | 
| 9 | 
            +
                    channel = Thread.current[:dest]
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                  if File.exist?("#{config.path}/shares/#{@channels_name[channel]}.csv") and !@shares.key?(@channels_name[channel])
         | 
| 12 | 
            +
                    t = CSV.table("#{config.path}/shares/#{@channels_name[channel]}.csv", headers: ['share_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'to_channel', 'condition'])
         | 
| 13 | 
            +
                    @shares[@channels_name[channel]] = t
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                  found = false
         | 
| 16 | 
            +
                  message = ''
         | 
| 17 | 
            +
                  if @shares[@channels_name[channel]][:share_id].include?(share_id.to_i)
         | 
| 18 | 
            +
                    CSV.open("#{config.path}/shares/#{@channels_name[channel]}.csv", "w") do |csv|
         | 
| 19 | 
            +
                      @shares[@channels_name[channel]].each do |row|
         | 
| 20 | 
            +
                        if row[:share_id].to_i == share_id.to_i
         | 
| 21 | 
            +
                          message = row[:condition]
         | 
| 22 | 
            +
                          row[:user_deleted] = user.name
         | 
| 23 | 
            +
                        end    
         | 
| 24 | 
            +
                        csv << row
         | 
| 25 | 
            +
                      end
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                    respond "The share has been deleted: #{message}"
         | 
| 28 | 
            +
                  else
         | 
| 29 | 
            +
                    respond "Sorry but I didn't find the share id #{share_id}. Call `see shares` to see all the ids."
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            class SlackSmartBot
         | 
| 2 | 
            +
              def delete_team(user, team_name)
         | 
| 3 | 
            +
                save_stats(__method__) if answer.empty?
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                if Thread.current[:dest][0] == "D"
         | 
| 6 | 
            +
                  respond "This command cannot be called from a DM"
         | 
| 7 | 
            +
                else
         | 
| 8 | 
            +
                  get_teams()
         | 
| 9 | 
            +
                  if !@teams.key?(team_name.to_sym)
         | 
| 10 | 
            +
                    respond "It seems like the team *#{team_name}* doesn't exist.\nRelated commands `add team TEAM_NAME PROPERTIES`, `see team TEAM_NAME`, `see teams`"
         | 
| 11 | 
            +
                  elsif !(@teams[team_name.to_sym].members.values + [@teams[team_name.to_sym].creator] + config.masters).flatten.include?(user.name)
         | 
| 12 | 
            +
                    respond "You have to be a member of the team, the creator or a Master admin to be able to delete this team."
         | 
| 13 | 
            +
                  else
         | 
| 14 | 
            +
                    if answer.empty?
         | 
| 15 | 
            +
                      ask "do you really want to delete the #{team_name} team? (yes/no)"
         | 
| 16 | 
            +
                    else
         | 
| 17 | 
            +
                      case answer
         | 
| 18 | 
            +
                      when /yes/i, /yep/i, /sure/i
         | 
| 19 | 
            +
                        answer_delete
         | 
| 20 | 
            +
                        @teams.delete(team_name.to_sym)
         | 
| 21 | 
            +
                        update_teams()
         | 
| 22 | 
            +
                        respond "The team #{team_name} has been deleted."
         | 
| 23 | 
            +
                      when /no/i, /nope/i, /cancel/i
         | 
| 24 | 
            +
                        answer_delete
         | 
| 25 | 
            +
                        respond "Ok, the team was not deleted"
         | 
| 26 | 
            +
                      else
         | 
| 27 | 
            +
                        respond "I don't understand"
         | 
| 28 | 
            +
                        ask "do you really want to delete the #{team_name} team? (yes/no)"  
         | 
| 29 | 
            +
                      end
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            class SlackSmartBot
         | 
| 2 | 
            +
              def deny_access(user, command_id)
         | 
| 3 | 
            +
                save_stats(__method__)
         | 
| 4 | 
            +
                not_allowed = ['hi_bot', 'bye_bot', "allow_access", "deny_access", "get_bot_logs", "add_routine", "pause_bot", "pause_routine", "remove_routine", "run_routine", "start_bot",
         | 
| 5 | 
            +
                               "start_routine", "delete_message", "send_message", "kill_bot_on_channel", "exit_bot", "notify_message", "publish_announcements", "set_general_message",
         | 
| 6 | 
            +
                               "set_maintenance", 'bot_help', 'bot_rules']
         | 
| 7 | 
            +
                if !is_admin?(user.name)
         | 
| 8 | 
            +
                  respond "Only admins of this channel can use this command. Take a look who is an admin of this channel by calling `see admins`"
         | 
| 9 | 
            +
                elsif Thread.current[:dest][0] == "D"
         | 
| 10 | 
            +
                  respond "This command cannot be called from a DM"
         | 
| 11 | 
            +
                elsif not_allowed.include?(command_id)
         | 
| 12 | 
            +
                  respond "Sorry but the access for `#{command_id}` cannot be changed."
         | 
| 13 | 
            +
                else
         | 
| 14 | 
            +
                  if Thread.current[:typem] == :on_call
         | 
| 15 | 
            +
                    channel = Thread.current[:dchannel]
         | 
| 16 | 
            +
                  elsif Thread.current[:using_channel].to_s == ""
         | 
| 17 | 
            +
                    channel = Thread.current[:dest]
         | 
| 18 | 
            +
                  else
         | 
| 19 | 
            +
                    channel = Thread.current[:using_channel]
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                  command_ids = get_command_ids()
         | 
| 22 | 
            +
                  if command_ids.values.flatten.include?(command_id)
         | 
| 23 | 
            +
                    if !@access_channels.key?(channel)
         | 
| 24 | 
            +
                      @access_channels[channel] = {}
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    @access_channels[channel][command_id] = []
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    update_access_channels()
         | 
| 30 | 
            +
                    respond "The command `#{command_id}` won't be available in this channel. Call `allow access #{command_id}` if you want it back."
         | 
| 31 | 
            +
                  else
         | 
| 32 | 
            +
                    respond "It seems like #{command_id} is not valid. Please be sure that exists by calling `see command ids`"
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
            end
         | 
| @@ -1,21 +1,26 @@ | |
| 1 1 | 
             
            class SlackSmartBot
         | 
| 2 2 |  | 
| 3 | 
            -
               | 
| 4 | 
            -
              # help: `Hi Bot`
         | 
| 5 | 
            -
              # help: `Hi Smart`
         | 
| 6 | 
            -
              # help: `Hello Bot` `Hola Bot` `Hallo Bot` `What's up Bot` `Hey Bot` `Hæ Bot`
         | 
| 7 | 
            -
              # help: `Hello THE_NAME_OF_THE_BOT`
         | 
| 8 | 
            -
              # help:    Bot starts listening to you
         | 
| 9 | 
            -
              # help:    After that if you want to avoid a single message to be treated by the smart bot, start the message by -
         | 
| 10 | 
            -
              # help:    Also apart of Hello you can use _Hallo, Hi, Hola, What's up, Hey, Hæ_
         | 
| 11 | 
            -
              # help:
         | 
| 12 | 
            -
              def hi_bot(user, dest, dchannel, from, display_name)
         | 
| 3 | 
            +
              def hi_bot(user, dest, from, display_name)
         | 
| 13 4 | 
             
                if @status == :on
         | 
| 14 5 | 
             
                  save_stats(__method__)
         | 
| 15 6 | 
             
                  greetings = ["Hello", "Hallo", "Hi", "Hola", "What's up", "Hey", "Hæ"].sample
         | 
| 16 7 | 
             
                  respond "#{greetings} #{display_name}", dest
         | 
| 8 | 
            +
                  if Thread.current[:typem] == :on_pub or Thread.current[:typem] == :on_pg
         | 
| 9 | 
            +
                    respond "You are on a channel where the SmartBot is just a member. You can only run general bot commands.\nCall `bot help` to see the commands you can use."
         | 
| 10 | 
            +
                  elsif Thread.current[:typem] == :on_extended
         | 
| 11 | 
            +
                    message = ["You are on an extended channel from <##{@channel_id}> so you can use all specific commands from that channel just adding !, !! or ^ before the command."]
         | 
| 12 | 
            +
                    message << "Call `bot help` to see the commands you can use."
         | 
| 13 | 
            +
                    respond message.join("\n")
         | 
| 14 | 
            +
                  elsif Thread.current[:typem] == :on_dm and Thread.current[:using_channel] == ''
         | 
| 15 | 
            +
                    respond "To start using the rules from a Bot channel call `use #CHANNEL`.\nAvailable SmartBots: <##{@bots_created.keys.join('>, <#')}>\nIf you want to call just one command from a specific channel: `#CHANNEL COMMAND`"
         | 
| 16 | 
            +
                  else
         | 
| 17 | 
            +
                    respond "You are on <##{@channel_id}> SmartBot channel. Call `bot help` to see all commands you can use or `bot rules` just to see the specific commands for this Bot channel."
         | 
| 18 | 
            +
                  end
         | 
| 17 19 | 
             
                  if Thread.current[:using_channel]!=''
         | 
| 18 | 
            -
                     | 
| 20 | 
            +
                    message = ["You are using rules from <##{Thread.current[:using_channel]}>"]
         | 
| 21 | 
            +
                    message << "If you want to change bot channel rules call `use #CHANNEL` or `stop using rules from <##{Thread.current[:using_channel]}>` to stop using rules from this channel."
         | 
| 22 | 
            +
                    message << "You can call a command from any other channel by calling `#CHANNEL COMMAND`" if Thread.current[:typem] == :on_dm
         | 
| 23 | 
            +
                    respond message.join("\n")
         | 
| 19 24 | 
             
                  end
         | 
| 20 25 | 
             
                  @listening[from] = {} unless @listening.key?(from)
         | 
| 21 26 | 
             
                  if Thread.current[:on_thread]
         |