Исходник Список администрации в стиле Genshin Impact

xSkateboard

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

изображение_2022-05-22_041750927.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/.../сюда и запускаем код (лучше скопируйте с гита его)

result.png
 

izicapt

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

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

xSkateboard

Активный
Автор темы
34
118
Давай в стиле Brawl Stars,так уж каждому понравится
Ты можешь поменять картинки сам, просто закинув свои в директории img/../
Таким образом, ты можешь даже создать свою гачи администрацию, со своими Van или Billy
 
  • Нравится
Реакции: chereshnya

izicapt

Известный
330
102
Слушай,а вправду стоит сделать с Гачи.Бравл старс уже устарел.Спасибо за идею!
Ты можешь поменять картинки сам, просто закинув свои в директории img/../
Таким образом, ты можешь даже создать свою гачи администрацию, со своими Van или Billy
 
  • Влюблен
Реакции: Hristot

xSkateboard

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

45 строка в файле:
Python:
parsed = re.findall("(.*) \[(.*)] - (.*)", line)[0]
Парсит такую строку:
Ник [Префикс] - Должность

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

Можете писать ниже свои строки, а я к ним регулярку в ответ
 
45 строка в файле:
Python:
parsed = re.findall("(.*) \[(.*)] - (.*)", line)[0]
Парсит такую строку:
Ник [Префикс] - Должность

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

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

ewin

Известный
675
369
Скриншот ошибки прикрепи, скорее всего слишком мало картинок залил (в админах и мл. админах должно быть минимум по 25)
не учел что на некоторых серверах имеется ЗГА из-за чего скрипт и крашится.
а так прикольная работа
 

xSkateboard

Активный
Автор темы
34
118
не учел что на некоторых серверах имеется ЗГА из-за чего скрипт и крашится.
а так прикольная работа
Картинку одну добавь в sr_admin, делал всё под гилберт, ибо я зачем-то туда восстановился на админку вхаывхав
 

izicapt

Известный
330
102
45 строка в файле:
Python:
parsed = re.findall("(.*) \[(.*)] - (.*)", line)[0]
Парсит такую строку:
Ник [Префикс] - Должность

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

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