LINUX.ORG.RU

История изменений

Исправление derlafff, (текущая версия) :

виртуал это тот, кто имеет аккаунт, связанный через тикеты с другим аккаунтом

ticket1|user1
ticket1|user2
ticket2|user2
ticket2|user3
ticket3|user3

user3 - виртуал user1, user2. При этом последние два виртуалы двух остальных из троицы.

Есть отдельная таблица users, которая имеет столбец banned.

Есть также рабочая реализация ban(), которая работает на любой вложенности, но она просто ужасна и слишком ресурсоемка.

ban() {

  local virtual
  local i_users
  local e_users
  local i_tickets
  local e_tickets
  local ticket_entry
  local add_users
  local reason

  i_users=$1
  e_users=''
  i_tickets=''
  e_tickets=''
  add_users=''
  reason=$(s3strip_quotes "$2")

  #пока нам есть, кого банить
  while [ -n "$i_users" ]; do

    #для каждого виртуала
    for virtual in $i_users; do
      #для начала его забаним
      ban_username "$virtual" "$1" "$reason" || return 93

      #добавим в наш список все его тикеты
      i_tickets="$i_tickets "$(s3query "$DB" "select ticket from bans where user='$virtual'")

      #и по каждому тикету найдем еще виртуалов
      for ticket_entry in $i_tickets; do
        if ! echo "$e_tickets" | grep -q -e "$ticket_entry"; then

          #добавляем новых виртуалов во временный список
          add_users="$add_users "$(s3query "$DB" "select user from bans where ticket='$ticket_entry'" | sort | uniq)

          #не забывая добавить тикет в использованные
          e_tickets="$e_tickets $ticket_entry"
        else
          true
        fi
      done
    done

    #а старых виртуалов добавляем в использованные
    e_users="$e_users $i_users"
    i_users=''

    #смотрим, есть ли в новом списке уже использованные
    for virtual in $add_users; do

      #если нет, добавляем
      if ! echo "$e_users" | grep -q -e "$virtual"; then
        i_users="$i_users $virtual"
      fi
    done

    add_users=''

  done

}

Исправление derlafff, :

виртуал это тот, кто имеет аккаунт, связанный через тикеты с другим аккаунтом

ticket1|user1
ticket1|user2
ticket2|user2
ticket2|user3
ticket3|user3

user3 - виртуал user1, user2. При этом последние два виртуалы двух остальных из троицы.

Есть отдельная таблица users, которая имеет столбец banned.

Есть также рабочая реализация ban(), которая работает на любой вложенности, но она просто ужасна и слишком ресурсоемка.

ban() {

  local virtual
  local i_users
  local e_users
  local i_tickets
  local e_tickets
  local ticket_entry
  local add_users
  local reason

  i_users=$1
  e_users=''
  i_tickets=''
  e_tickets=''
  add_users=''
  reason=$(s3strip_quotes "$2")
  debug reason "$reason"

  #return 15

  #пока нам есть, кого банить
  while [ -n "$i_users" ]; do

    #для каждого виртуала
    for virtual in $i_users; do
      #для начала его забаним
      ban_username "$virtual" "$1" "$reason" || return 93

      #добавим в наш список все его тикеты
      i_tickets="$i_tickets "$(s3query "$DB" "select ticket from bans where user='$virtual'")

      #и по каждому тикету найдем еще виртуалов
      for ticket_entry in $i_tickets; do
        if ! echo "$e_tickets" | grep -q -e "$ticket_entry"; then

          #добавляем новых виртуалов во временный список
          add_users="$add_users "$(s3query "$DB" "select user from bans where ticket='$ticket_entry'" | sort | uniq)

          #не забывая добавить тикет в использованные
          e_tickets="$e_tickets $ticket_entry"
        else
          true
          #debug skipping "$ticket_entry"
        fi
      done
    done

    #а старых виртуалов добавляем в использованные
    e_users="$e_users $i_users"
    i_users=''

    #смотрим, есть ли в новом списке уже использованные
    for virtual in $add_users; do

      #если нет, добавляем
      if ! echo "$e_users" | grep -q -e "$virtual"; then
        i_users="$i_users $virtual"
      fi
    done

    add_users=''

  done

}

Исходная версия derlafff, :

виртуал это тот, кто имеет аккаунт, связанный через тикеты с другим аккаунтом

ticket1|user1
ticket1|user2
ticket2|user2
ticket2|user3
ticket3|user3

user3 - виртуал user1, user2. При этом последние два виртуалы двух остальных из троицы.

Есть отдельная таблица users, которая имеет столбец banned.

Есть также рабочая реализация ban(), которая работает на любой вложенности, но она просто ужасна и слишком ресурсоемка.

ban() {

  local virtual
  local i_users
  local e_users
  local i_tickets
  local e_tickets
  local ticket_entry
  local add_users
  local reason

  i_users=$1
  e_users=''
  i_tickets=''
  e_tickets=''
  add_users=''
  reason=$(s3strip_quotes "$2")
  debug reason "$reason"

  #return 15

  #пока нам есть, кого банить
  while [ -n "$i_users" ]; do

    #для каждого виртуала
    for virtual in $i_users; do
      #для начала его забаним
      ban_username "$virtual" "$1" "$reason" || return 93

      #добавим в наш список все его тикеты
      i_tickets="$i_tickets "$(s3query "$DB" "select ticket from bans where user='$virtual'")

      #и по каждому тикету найдем еще виртуалов
      for ticket_entry in $i_tickets; do
        if ! echo "$e_tickets" | grep -q -e "$ticket_entry"; then

#          debug forentry_valid "$ticket_entry"
          #добавляем новых виртуалов во временный список
          add_users="$add_users "$(s3query "$DB" "select user from bans where ticket='$ticket_entry'" | sort | uniq)

          #не забывая добавить тикет в использованные
          e_tickets="$e_tickets $ticket_entry"
        else
          true
          #debug skipping "$ticket_entry"
        fi
      done
    done

    #а старых виртуалов добавляем в использованные
    e_users="$e_users $i_users"
    i_users=''

    #смотрим, есть ли в новом списке уже использованные
    for virtual in $add_users; do

      #если нет, добавляем
      if ! echo "$e_users" | grep -q -e "$virtual"; then
        i_users="$i_users $virtual"
      fi
    done

    add_users=''

  done

}