PDA

Просмотр полной версии : Список администрации в стиле Genshin Impact


xSkateboard
22.05.2022, 05:33
Здарова, юзеры бластхака!

Вчера увидел сообщение в группе ВК, про новый список администрации на форуме сервере Casa-Grande




https://forum.antichat.xyz/attachments/28045766/img_45552d3ea7.png




Вышло прикольно (но я ненавижу бравл старс емае), но вот как своевременно обновлять это всё? Поэтому у меня зародилась идея - автоматизировать создание подобной пикчи. Что я и реализовал за 2 часа. (Результат под спойлером в конце поста)

Гитхаб: https://github.com/qskateboard/graphicAdminsList

Для начала определимся, в стиле чего будет делать? Я взял Genshin Impact, ибо знаю эту игру да и лого персонажей легко найти в интернете. Находим шрифт от этой игры, чтобы всё было в одном стиле.

Работать мы будем естественно на питоне и графической библиотеки Pillow

Далее идет код и рядом с ним объяснение, что делает.

Генерация карточки администратора:






def
generate_single_admin
(
admin
,
level
)
:
global
font
,
font_grade

files
=
glob
(
"img/"
+
level
+
"/*"
)
# Получаем массив со всеми файлами определенного уровня адм
img
=
Image
.
open
(
files
[
admin
[
"index"
]
]
)
# Получаем картинку по пути, который равняется номеру админа
draw
=
ImageDraw
.
Draw
(
img
)
w
,
h
=
draw
.
textsize
(
admin
[
'nickname'
]
,
font
=
font
)
# Тут мы получаем ширину и высоту ника
w2
,
h2
=
draw
.
textsize
(
admin
[
'grade'
]
,
font
=
font_grade
)
# Аналогично верхнему, только должность
offset_y
=
(
256
-
h2
)
/
1.25
if
w
>
w2
:
# Тут должна была быть динамичнеское определение плашки с информацией, но сделал так
rect
=
(
0
,
offset_y
-
5
,
255
,
offset_y
+
55
)
# Точка начала и конца прямоугольника
else
:
rect
=
(
0
,
offset_y
-
5
,
255
,
offset_y
+
55
)
draw
.
rounded_rectangle
(
rect
,
fill
=
(
255
,
255
,
255
)
,
outline
=
(
24
,
24
,
24
)
,
radius
=
4
)
# Рисуем прямоугольник
draw
.
text
(
(
(
256
-
w
)
/
2
,
offset_y
)
,
admin
[
'nickname'
]
,
(
44
,
44
,
44
)
,
font
=
font
)
# Пишем ник
draw
.
text
(
(
(
256
-
w2
)
/
2
,
offset_y
+
30
)
,
admin
[
'grade'
]
,
(
44
,
44
,
44
)
,
font
=
font_grade
)
# Пишем должность
return
img
# Возвраащем объект готовой карточки




И основная функция:

Основная функция:






def
generate_picture
(
admin_list
,
count
)
:
titles
=
{
# Название уровней
"sr_admin"
:
"ГЛАВНАЯ АДМИНИСТРАЦИЯ"
,
"admin"
:
"АДМИНИСТРАЦИЯ ЧЕТВЁРТОГО УРОВНЯ"
,
"jnr_admin"
:
"АДМИНИСТРАЦИЯ ТРЕТЬЕГО УРОВНЯ"
,
"moderator"
:
"АДМИНИСТРАЦИЯ ВТОРОГО УРОВНЯ"
,
"helper"
:
"АДМИНИСТРАЦИЯ ПЕРВОГО УРОВНЯ"
}
# Создаем фон с динамическим размером
background
=
Image
.
new
(
mode
=
"RGB"
,
size
=
(
256
*
3
+
150
,
int
(
count
/
3
)
*
(
256
+
120
)
)
)
draw
=
ImageDraw
.
Draw
(
background
)
y
=
0
# Задаем высоту
prev_grade
=
""
for
key
,
value
in
admin_list
.
items
(
)
:
# Проходимся по всем уровням админки отдельно
if
prev_grade
!=
key
:
# Если уровень админки поменялся от прошлого в цикле
prev_grade
=
key
y
+=
100
# Поднимаем оффсет высоты
w
,
h
=
draw
.
textsize
(
titles
[
key
]
,
font
=
font_title
)
# Узнаем высоту и ширину название уровня
draw
.
text
(
(
(
256
*
3
+
150
-
w
)
/
2
,
y
-
70
)
,
titles
[
key
]
,
(
255
,
255
,
255
)
,
font
=
font_title
)
# Пишем текст по центру экрана
# Задаем переменные для полоски из 3 карточек
row
=
0
x
=
25
# Делаем так, чтобы если все администраторы не делятся на 3 нацело
remain
=
len
(
value
)
%
3
if
remain
==
1
:
# То сначала рисуется по центру 1 админ по коордам
x
=
int
(
75
+
(
256
*
3
)
/
3
)
if
remain
==
2
:
# Тут по другим коордам 2 админа
x
=
int
(
30
+
(
256
*
3
)
/
5
)
for
admin
in
value
:
# Проходимся циклом по всем админам в опр. уровне
if
row
==
3
or
(
row
==
remain
and
row
!=
0
)
:
# Если 3 админа уже нарисовно или условие remain
# Обнуляем переменные и делаем перенос строк
row
=
0
x
=
25
y
+=
256
+
50
remain
=
0
single
=
generate_single_admin
(
admin
,
key
)
# Генерируем карточку администратора
background
.
paste
(
single
,
(
x
,
y
)
,
mask
=
single
)
# Вставляем на фон, mask=single нужно, чтобы прозрачные поля корректно отображались
# Делаем отступ вправо
x
+=
256
+
50
row
+=
1
y
+=
256
+
50
# Перенос строки (уровень админки новый)
# Тут создаем текст и пишем в конце холста, естественно центрируя по центру
text_count
=
"Общее количество администраторов - {}."
.
format
(
count
)
y
+=
200
w
,
h
=
draw
.
textsize
(
text_count
,
font
=
font_title
)
draw
.
text
(
(
(
256
*
3
+
150
-
w
)
/
2
,
y
-
70
)
,
text_count
,
(
255
,
255
,
255
)
,
font
=
font_title
)
background
.
save
(
"result.png"
)
# Сохраняем результат




Заливаем пикчи в директорию img/.../сюда и запускаем код (лучше скопируйте с гита его)




https://github.com/qskateboard/graphicAdminsList/raw/master/result.png?raw=true

izicapt
22.05.2022, 09:44
Здарова, юзеры бластхака!
Вчера увидел сообщение в группе ВК, про новый список администрации на форуме сервере Casa-Grande






Вышло прикольно (но я ненавижу бравл старс емае), но вот как своевременно обновлять это всё? Поэтому у меня зародилась идея - автоматизировать создание подобной пикчи. Что я и реализовал за 2 часа. (Результат под спойлером в конце поста)

Гитхаб: https://github.com/qskateboard/graphicAdminsList

Для начала определимся, в стиле чего будет делать? Я взял Genshin Impact, ибо знаю эту игру да и лого персонажей легко найти в интернете. Находим шрифт от этой игры, чтобы всё было в одном стиле.

Работать мы будем естественно на питоне и графической библиотеки Pillow
Далее идет код и рядом с ним объяснение, что делает.

Генерация карточки администратора:






def
generate_single_admin
(
admin
,
level
)
:
global
font
,
font_grade

files
=
glob
(
"img/"
+
level
+
"/*"
)
# Получаем массив со всеми файлами определенного уровня адм
img
=
Image
.
open
(
files
[
admin
[
"index"
]
]
)
# Получаем картинку по пути, который равняется номеру админа
draw
=
ImageDraw
.
Draw
(
img
)
w
,
h
=
draw
.
textsize
(
admin
[
'nickname'
]
,
font
=
font
)
# Тут мы получаем ширину и высоту ника
w2
,
h2
=
draw
.
textsize
(
admin
[
'grade'
]
,
font
=
font_grade
)
# Аналогично верхнему, только должность
offset_y
=
(
256
-
h2
)
/
1.25
if
w
>
w2
:
# Тут должна была быть динамичнеское определение плашки с информацией, но сделал так
rect
=
(
0
,
offset_y
-
5
,
255
,
offset_y
+
55
)
# Точка начала и конца прямоугольника
else
:
rect
=
(
0
,
offset_y
-
5
,
255
,
offset_y
+
55
)
draw
.
rounded_rectangle
(
rect
,
fill
=
(
255
,
255
,
255
)
,
outline
=
(
24
,
24
,
24
)
,
radius
=
4
)
# Рисуем прямоугольник
draw
.
text
(
(
(
256
-
w
)
/
2
,
offset_y
)
,
admin
[
'nickname'
]
,
(
44
,
44
,
44
)
,
font
=
font
)
# Пишем ник
draw
.
text
(
(
(
256
-
w2
)
/
2
,
offset_y
+
30
)
,
admin
[
'grade'
]
,
(
44
,
44
,
44
)
,
font
=
font_grade
)
# Пишем должность
return
img
# Возвраащем объект готовой карточки




И основная функция:

Основная функция:






def
generate_picture
(
admin_list
,
count
)
:
titles
=
{
# Название уровней
"sr_admin"
:
"ГЛАВНАЯ АДМИНИСТРАЦИЯ"
,
"admin"
:
"АДМИНИСТРАЦИЯ ЧЕТВЁРТОГО УРОВНЯ"
,
"jnr_admin"
:
"АДМИНИСТРАЦИЯ ТРЕТЬЕГО УРОВНЯ"
,
"moderator"
:
"АДМИНИСТРАЦИЯ ВТОРОГО УРОВНЯ"
,
"helper"
:
"АДМИНИСТРАЦИЯ ПЕРВОГО УРОВНЯ"
}
# Создаем фон с динамическим размером
background
=
Image
.
new
(
mode
=
"RGB"
,
size
=
(
256
*
3
+
150
,
int
(
count
/
3
)
*
(
256
+
120
)
)
)
draw
=
ImageDraw
.
Draw
(
background
)
y
=
0
# Задаем высоту
prev_grade
=
""
for
key
,
value
in
admin_list
.
items
(
)
:
# Проходимся по всем уровням админки отдельно
if
prev_grade
!=
key
:
# Если уровень админки поменялся от прошлого в цикле
prev_grade
=
key
y
+=
100
# Поднимаем оффсет высоты
w
,
h
=
draw
.
textsize
(
titles
[
key
]
,
font
=
font_title
)
# Узнаем высоту и ширину название уровня
draw
.
text
(
(
(
256
*
3
+
150
-
w
)
/
2
,
y
-
70
)
,
titles
[
key
]
,
(
255
,
255
,
255
)
,
font
=
font_title
)
# Пишем текст по центру экрана
# Задаем переменные для полоски из 3 карточек
row
=
0
x
=
25
# Делаем так, чтобы если все администраторы не делятся на 3 нацело
remain
=
len
(
value
)
%
3
if
remain
==
1
:
# То сначала рисуется по центру 1 админ по коордам
x
=
int
(
75
+
(
256
*
3
)
/
3
)
if
remain
==
2
:
# Тут по другим коордам 2 админа
x
=
int
(
30
+
(
256
*
3
)
/
5
)
for
admin
in
value
:
# Проходимся циклом по всем админам в опр. уровне
if
row
==
3
or
(
row
==
remain
and
row
!=
0
)
:
# Если 3 админа уже нарисовно или условие remain
# Обнуляем переменные и делаем перенос строк
row
=
0
x
=
25
y
+=
256
+
50
remain
=
0
single
=
generate_single_admin
(
admin
,
key
)
# Генерируем карточку администратора
background
.
paste
(
single
,
(
x
,
y
)
,
mask
=
single
)
# Вставляем на фон, mask=single нужно, чтобы прозрачные поля корректно отображались
# Делаем отступ вправо
x
+=
256
+
50
row
+=
1
y
+=
256
+
50
# Перенос строки (уровень админки новый)
# Тут создаем текст и пишем в конце холста, естественно центрируя по центру
text_count
=
"Общее количество администраторов - {}."
.
format
(
count
)
y
+=
200
w
,
h
=
draw
.
textsize
(
text_count
,
font
=
font_title
)
draw
.
text
(
(
(
256
*
3
+
150
-
w
)
/
2
,
y
-
70
)
,
text_count
,
(
255
,
255
,
255
)
,
font
=
font_title
)
background
.
save
(
"result.png"
)
# Сохраняем результат




Заливаем пикчи в директорию img/.../сюда и запускаем код (лучше скопируйте с гита его)




https://github.com/qskateboard/graphicAdminsList/raw/master/result.png?raw=true





Давай в стиле Brawl Stars,так уж каждому понравится

xSkateboard
22.05.2022, 10:28
Давай в стиле Brawl Stars,так уж каждому понравится


Ты можешь поменять картинки сам, просто закинув свои в директории img/../

Таким образом, ты можешь даже создать свою гачи администрацию, со своими Van или Billy

izicapt
22.05.2022, 14:53
Слушай,а вправду стоит сделать с Гачи.Бравл старс уже устарел.Спасибо за идею!



Ты можешь поменять картинки сам, просто закинув свои в директории img/../
Таким образом, ты можешь даже создать свою гачи администрацию, со своими Van или Billy

хорошая работа олег
22.05.2022, 17:28
заменил ники админов в admins.txt, заменил картинки, запустил main.py и... целое нихуя. не запускает фото

izicapt
22.05.2022, 18:11
Согласен, та же ситуация. Работает лишь с тем примером который показал автор.



заменил ники админов в admins.txt, заменил картинки, запустил main.py и... целое нихуя. не запускает фото

munnniisss
22.05.2022, 18:11
Годно, мужик

xSkateboard
22.05.2022, 18:22
Согласен, та же ситуация. Работает лишь с тем примером который показал автор.



45 строка в файле:

Python:






parsed
=
re
.
findall
(
"(.*) \[(.*)] - (.*)"
,
line
)
[
0
]




Парсит такую строку:

Ник [Префикс] - Должность

Учитывайте, что пробелы должны быть учтены - иначе переделывайте регулярное выражение.

Можете писать ниже свои строки, а я к ним регулярку в ответ

хорошая работа олег
22.05.2022, 19:03
45 строка в файле:

Python:






parsed
=
re
.
findall
(
"(.*) \[(.*)] - (.*)"
,
line
)
[
0
]




Парсит такую строку:
Ник [Префикс] - Должность

Учитывайте, что пробелы должны быть учтены - иначе переделывайте регулярное выражение.

Можете писать ниже свои строки, а я к ним регулярку в ответ


заменил картинки, запустил main.py и вылетает

xSkateboard
22.05.2022, 21:03
заменил картинки, запустил main.py и вылетает


Скриншот ошибки прикрепи, скорее всего слишком мало картинок залил (в админах и мл. админах должно быть минимум по 25)

ewin
23.05.2022, 08:22
Скриншот ошибки прикрепи, скорее всего слишком мало картинок залил (в админах и мл. админах должно быть минимум по 25)


не учел что на некоторых серверах имеется ЗГА из-за чего скрипт и крашится.

а так прикольная работа

xSkateboard
23.05.2022, 09:42
не учел что на некоторых серверах имеется ЗГА из-за чего скрипт и крашится.
а так прикольная работа


Картинку одну добавь в sr_admin, делал всё под гилберт, ибо я зачем-то туда восстановился на админку вхаывхав

izicapt
23.05.2022, 16:55
45 строка в файле:

Python:






parsed
=
re
.
findall
(
"(.*) \[(.*)] - (.*)"
,
line
)
[
0
]




Парсит такую строку:
Ник [Префикс] - Должность

Учитывайте, что пробелы должны быть учтены - иначе переделывайте регулярное выражение.

Можете писать ниже свои строки, а я к ним регулярку в ответ


Сколько пробелов делать? Один только?

xSkateboard
24.05.2022, 10:15
Сколько пробелов делать? Один только?


да, смотри в файле admins.txt пример