ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Python (https://forum.antichat.xyz/forumdisplay.php?f=205)
-   -   Список администрации в стиле Genshin Impact (https://forum.antichat.xyz/showthread.php?t=1433795)

xSkateboard 22.05.2022 05:33

Здарова, юзеры бластхака!

Вчера увидел сообщение в группе ВК, про новый список администрации на форуме сервере 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/.../сюда и запускаем код (лучше скопируйте с гита его)

Цитата:

Сообщение от Спойлер


izicapt 22.05.2022 09:44

Цитата:

Сообщение от xSkateboard

Здарова, юзеры бластхака!
Вчера увидел сообщение в группе ВК, про новый список администрации на форуме сервере 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/.../сюда и запускаем код (лучше скопируйте с гита его)

Цитата:

Сообщение от Спойлер


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

xSkateboard 22.05.2022 10:28

Цитата:

Сообщение от izicapt

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

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

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

izicapt 22.05.2022 14:53

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

Цитата:

Сообщение от xSkateboard

Ты можешь поменять картинки сам, просто закинув свои в директории 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

Цитата:

Сообщение от izicapt

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

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

Python:





Код:

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



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

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

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

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

хорошая работа олег 22.05.2022 19:03

Цитата:

Сообщение от xSkateboard

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

Python:





Код:

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



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

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

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

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

xSkateboard 22.05.2022 21:03

Цитата:

Сообщение от хорошая работа олег

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

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


Время: 04:27