История изменений
Исправление 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
}