Inicial
@@ -0,0 +1,51 @@
|
||||
# ac_soap.py
|
||||
import requests
|
||||
import base64
|
||||
from django.conf import settings
|
||||
|
||||
def execute_soap_command(command):
|
||||
"""
|
||||
Ejecuta un comando en el servidor AzerothCore usando SOAP.
|
||||
|
||||
Parameters:
|
||||
- command (str): El comando a ejecutar, por ejemplo, ".additem 3200"
|
||||
|
||||
Returns:
|
||||
- str: La respuesta del servidor si el comando se ejecuta correctamente.
|
||||
- None: Si ocurre algún error durante la ejecución.
|
||||
"""
|
||||
try:
|
||||
# Crear la carga SOAP
|
||||
soap_command = f'''<?xml version="1.0" encoding="utf-8"?>
|
||||
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="{settings.AC_SOAP_URN}">
|
||||
<SOAP-ENV:Body>
|
||||
<ns1:executeCommand>
|
||||
<command>{command}</command>
|
||||
</ns1:executeCommand>
|
||||
</SOAP-ENV:Body>
|
||||
</SOAP-ENV:Envelope>'''
|
||||
|
||||
# Autenticación básica usando las credenciales en settings.py
|
||||
auth_header = f"Basic {base64.b64encode(f'{settings.AC_SOAP_USER}:{settings.AC_SOAP_PASSWORD}'.encode()).decode()}"
|
||||
|
||||
headers = {
|
||||
'Authorization': auth_header,
|
||||
'Content-Type': 'application/xml'
|
||||
}
|
||||
|
||||
# Realizar la solicitud SOAP al servidor de AzerothCore
|
||||
response = requests.post(settings.AC_SOAP_URL, data=soap_command, headers=headers, timeout=5)
|
||||
|
||||
# Verificar si la respuesta fue exitosa
|
||||
if response.status_code == 200:
|
||||
return response.text
|
||||
else:
|
||||
print(f"[ERROR] Comando SOAP fallido: {response.status_code} - {response.text}")
|
||||
return None
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"[EXCEPCIÓN] Error de conexión con el servidor SOAP: {str(e)}")
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"[EXCEPCIÓN] Error inesperado al ejecutar el comando SOAP: {str(e)}")
|
||||
return None
|
||||
@@ -0,0 +1,137 @@
|
||||
# home/admin.py
|
||||
from django.contrib import admin
|
||||
from django import forms
|
||||
from .models import (
|
||||
Noticia, ClienteCategoria, SistemaOperativo, ServerSelection,
|
||||
RecruitAFriend, DownloadClientPage, ContentCreator, RecruitReward
|
||||
)
|
||||
from django.db import connections
|
||||
import logging
|
||||
from django.shortcuts import redirect
|
||||
from django_ckeditor_5.widgets import CKEditor5Widget
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Formulario para el modelo Noticia
|
||||
class NoticiaAdminForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Noticia
|
||||
fields = ['titulo', 'contenido', 'fecha_fin_evento', 'enlace']
|
||||
widgets = {
|
||||
'contenido': CKEditor5Widget(config_name='default'),
|
||||
}
|
||||
|
||||
@admin.register(Noticia)
|
||||
class NoticiaAdmin(admin.ModelAdmin):
|
||||
form = NoticiaAdminForm
|
||||
list_display = ['titulo', 'fecha_publicacion']
|
||||
readonly_fields = ['fecha_publicacion']
|
||||
fields = ['titulo', 'contenido', 'fecha_fin_evento', 'enlace']
|
||||
|
||||
|
||||
# Formulario para el modelo RecruitAFriend
|
||||
class RecruitAFriendAdminForm(forms.ModelForm):
|
||||
content = forms.CharField(widget=CKEditor5Widget(config_name='default'))
|
||||
|
||||
class Meta:
|
||||
model = RecruitAFriend
|
||||
fields = ['title', 'information', 'content']
|
||||
|
||||
@admin.register(RecruitAFriend)
|
||||
class RecruitAFriendAdmin(admin.ModelAdmin):
|
||||
form = RecruitAFriendAdminForm
|
||||
list_display = ['title', 'updated_at']
|
||||
fields = ['title', 'information', 'content']
|
||||
|
||||
|
||||
# Formulario para el modelo DownloadClientPage
|
||||
class DownloadClientPageAdminForm(forms.ModelForm):
|
||||
content = forms.CharField(widget=CKEditor5Widget(config_name='default'))
|
||||
mac_instructions = forms.CharField(widget=CKEditor5Widget(config_name='default'))
|
||||
|
||||
class Meta:
|
||||
model = DownloadClientPage
|
||||
fields = ['title', 'content', 'mac_instructions']
|
||||
|
||||
@admin.register(DownloadClientPage)
|
||||
class DownloadClientPageAdmin(admin.ModelAdmin):
|
||||
form = DownloadClientPageAdminForm
|
||||
list_display = ['title', 'updated_at']
|
||||
fields = ['title', 'content', 'mac_instructions']
|
||||
|
||||
|
||||
# Formulario para el modelo ContentCreator
|
||||
class ContentCreatorAdminForm(forms.ModelForm):
|
||||
description = forms.CharField(widget=CKEditor5Widget(config_name='default'))
|
||||
|
||||
class Meta:
|
||||
model = ContentCreator
|
||||
fields = [
|
||||
'title', 'description', 'content_type', 'subtitle',
|
||||
'youtube_video_url', 'avatar_image_url',
|
||||
'youtube_channel_url', 'facebook_page_url'
|
||||
]
|
||||
|
||||
@admin.register(ContentCreator)
|
||||
class ContentCreatorAdmin(admin.ModelAdmin):
|
||||
form = ContentCreatorAdminForm
|
||||
list_display = ['title', 'updated_at']
|
||||
fields = [
|
||||
'title', 'description', 'content_type', 'subtitle',
|
||||
'youtube_video_url', 'avatar_image_url',
|
||||
'youtube_channel_url', 'facebook_page_url'
|
||||
]
|
||||
|
||||
|
||||
# Administración para ServerSelection
|
||||
class ServerSelectionAdmin(admin.ModelAdmin):
|
||||
list_display = ['name', 'address', 'port', 'gamebuild']
|
||||
change_list_template = "admin/server_selection.html"
|
||||
|
||||
def changelist_view(self, request, extra_context=None):
|
||||
servers = []
|
||||
try:
|
||||
with connections['acore_auth'].cursor() as cursor:
|
||||
cursor.execute("SELECT id, name, address, port, gamebuild FROM realmlist")
|
||||
servers = cursor.fetchall()
|
||||
except Exception as e:
|
||||
logger.error("Error al obtener servidores: %s", e)
|
||||
|
||||
if request.method == "POST" and "server_selection" in request.POST:
|
||||
selected_server_id = int(request.POST["server_selection"])
|
||||
selected_server = next((s for s in servers if s[0] == selected_server_id), None)
|
||||
if selected_server:
|
||||
ServerSelection.objects.all().delete()
|
||||
ServerSelection.objects.create(
|
||||
server_id=selected_server[0],
|
||||
name=selected_server[1],
|
||||
address=selected_server[2],
|
||||
port=selected_server[3],
|
||||
gamebuild=selected_server[4]
|
||||
)
|
||||
return redirect("admin:home_serverselection_changelist")
|
||||
|
||||
extra_context = extra_context or {}
|
||||
extra_context['servers'] = servers
|
||||
return super().changelist_view(request, extra_context=extra_context)
|
||||
|
||||
|
||||
# Inlines para ClienteCategoria
|
||||
class SistemaOperativoInline(admin.TabularInline):
|
||||
model = SistemaOperativo
|
||||
extra = 1
|
||||
|
||||
class ClienteCategoriaAdmin(admin.ModelAdmin):
|
||||
inlines = [SistemaOperativoInline]
|
||||
|
||||
|
||||
@admin.register(RecruitReward)
|
||||
class RecruitRewardAdmin(admin.ModelAdmin):
|
||||
list_display = ('required_friends', 'reward_name', 'item_id', 'item_quantity', 'icon_class')
|
||||
search_fields = ('reward_name',)
|
||||
|
||||
|
||||
# Registro de modelos en el admin
|
||||
admin.site.register(ClienteCategoria, ClienteCategoriaAdmin)
|
||||
admin.site.register(SistemaOperativo)
|
||||
admin.site.register(ServerSelection, ServerSelectionAdmin)
|
||||
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class HomeConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'home'
|
||||
@@ -0,0 +1,39 @@
|
||||
from django.conf import settings
|
||||
from .models import ServerSelection
|
||||
from django.db import connections
|
||||
import socket
|
||||
|
||||
def url_principal(request):
|
||||
"""Devuelve la URL principal del sitio."""
|
||||
current_domain = f"{request.scheme}://{request.get_host()}"
|
||||
return {'URL_PRINCIPAL': current_domain}
|
||||
|
||||
def configuracion_global(request):
|
||||
"""Devuelve configuraciones globales como el nombre del servidor y el año actual."""
|
||||
return {
|
||||
'NOMBRE_SERVIDOR': settings.NOMBRE_SERVIDOR,
|
||||
'ANIO_ACTUAL': settings.ANIO_ACTUAL,
|
||||
}
|
||||
|
||||
def get_server_info(request):
|
||||
"""Devuelve información del servidor para que esté disponible en todas las plantillas."""
|
||||
server_selection = ServerSelection.objects.first()
|
||||
|
||||
online_count = 0
|
||||
if server_selection:
|
||||
# Obtener la cantidad de personajes en línea
|
||||
try:
|
||||
with connections['acore_characters'].cursor() as cursor:
|
||||
cursor.execute("SELECT COUNT(*) FROM characters WHERE online = 1")
|
||||
result = cursor.fetchone()
|
||||
if result is not None:
|
||||
online_count = result[0]
|
||||
except Exception as e:
|
||||
# Manejar errores de conexión o consulta
|
||||
print(f"Error al obtener personajes en línea: {e}")
|
||||
|
||||
return {
|
||||
'server': server_selection,
|
||||
'online_characters': online_count,
|
||||
'expansion': 'WotLK' if server_selection and server_selection.gamebuild == 12340 else 'Cataclysm',
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
# Generated by Django 5.1.2 on 2024-11-11 16:11
|
||||
|
||||
import django.db.models.deletion
|
||||
import django_ckeditor_5.fields
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='ClienteCategoria',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('nombre', models.CharField(max_length=100)),
|
||||
('descripcion', models.CharField(blank=True, max_length=200, null=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ContentCreator',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=200)),
|
||||
('description', django_ckeditor_5.fields.CKEditor5Field(verbose_name='Descripción')),
|
||||
('content_type', models.CharField(default='Contenido general', max_length=60)),
|
||||
('subtitle', models.CharField(default='Nova WoW', max_length=60)),
|
||||
('youtube_video_url', models.URLField(blank=True, max_length=300, null=True)),
|
||||
('avatar_image_url', models.URLField(blank=True, max_length=300, null=True)),
|
||||
('youtube_channel_url', models.URLField(blank=True, max_length=300, null=True)),
|
||||
('facebook_page_url', models.URLField(blank=True, max_length=300, null=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DownloadClientPage',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(default='Descarga del cliente', max_length=255)),
|
||||
('content', django_ckeditor_5.fields.CKEditor5Field(verbose_name='Contenido')),
|
||||
('mac_instructions', django_ckeditor_5.fields.CKEditor5Field(blank=True, null=True, verbose_name='Instrucciones para macOS')),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Noticia',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('titulo', models.CharField(max_length=200)),
|
||||
('contenido', django_ckeditor_5.fields.CKEditor5Field(verbose_name='Contenido')),
|
||||
('fecha_publicacion', models.DateTimeField(auto_now=True)),
|
||||
('fecha_fin_evento', models.DateField(blank=True, null=True)),
|
||||
('enlace', models.URLField(blank=True, null=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='RecruitAFriend',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(default='Recluta a un amigo', max_length=255)),
|
||||
('information', models.CharField(default='Información', max_length=255)),
|
||||
('content', django_ckeditor_5.fields.CKEditor5Field(verbose_name='Contenido')),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='RecruitReward',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('required_friends', models.IntegerField()),
|
||||
('reward_name', models.CharField(max_length=100)),
|
||||
('item_id', models.IntegerField()),
|
||||
('item_quantity', models.IntegerField(default=1)),
|
||||
('item_link', models.URLField()),
|
||||
('icon_class', models.CharField(help_text="Clase CSS para el icono (ej. 'icontinyl q3')", max_length=50)),
|
||||
('claimed_by', models.CharField(blank=True, max_length=100, null=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ServerSelection',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('server_id', models.IntegerField()),
|
||||
('name', models.CharField(max_length=100)),
|
||||
('address', models.CharField(max_length=100)),
|
||||
('port', models.IntegerField()),
|
||||
('gamebuild', models.IntegerField()),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ClaimedReward',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('account_id', models.IntegerField()),
|
||||
('character_name', models.CharField(max_length=100)),
|
||||
('username', models.CharField(max_length=100)),
|
||||
('claimed_at', models.DateTimeField(auto_now_add=True)),
|
||||
('recruit_reward', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='claimed_rewards', to='home.recruitreward')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='SistemaOperativo',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('nombre', models.CharField(max_length=100)),
|
||||
('url_descarga', models.URLField()),
|
||||
('categoria', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sistemas_operativos', to='home.clientecategoria')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,101 @@
|
||||
# home/models.py
|
||||
from django.db import models
|
||||
from django_ckeditor_5.fields import CKEditor5Field
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.utils import timezone
|
||||
|
||||
class Noticia(models.Model):
|
||||
titulo = models.CharField(max_length=200)
|
||||
contenido = CKEditor5Field('Contenido', config_name='default')
|
||||
fecha_publicacion = models.DateTimeField(auto_now=True) # Cambiado a DateTimeField
|
||||
fecha_fin_evento = models.DateField(null=True, blank=True)
|
||||
enlace = models.URLField(max_length=200, blank=True, null=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.titulo
|
||||
|
||||
|
||||
class ClienteCategoria(models.Model):
|
||||
nombre = models.CharField(max_length=100)
|
||||
descripcion = models.CharField(max_length=200, blank=True, null=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.nombre
|
||||
|
||||
|
||||
class SistemaOperativo(models.Model):
|
||||
categoria = models.ForeignKey(ClienteCategoria, related_name='sistemas_operativos', on_delete=models.CASCADE)
|
||||
nombre = models.CharField(max_length=100)
|
||||
url_descarga = models.URLField()
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.nombre} - {self.categoria.nombre}"
|
||||
|
||||
|
||||
class ServerSelection(models.Model):
|
||||
server_id = models.IntegerField()
|
||||
name = models.CharField(max_length=100)
|
||||
address = models.CharField(max_length=100)
|
||||
port = models.IntegerField()
|
||||
gamebuild = models.IntegerField()
|
||||
|
||||
def __str__(self):
|
||||
expansion = 'WotLK' if self.gamebuild == 12340 else 'Cataclysm' if self.gamebuild == 15595 else 'Unknown'
|
||||
return f"{self.name} ({expansion})"
|
||||
|
||||
|
||||
class RecruitAFriend(models.Model):
|
||||
title = models.CharField(max_length=255, default="Recluta a un amigo")
|
||||
information = models.CharField(max_length=255, default="Información")
|
||||
content = CKEditor5Field('Contenido', config_name='default')
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
|
||||
class DownloadClientPage(models.Model):
|
||||
title = models.CharField(max_length=255, default="Descarga del cliente")
|
||||
content = CKEditor5Field('Contenido', config_name='default')
|
||||
mac_instructions = CKEditor5Field('Instrucciones para macOS', blank=True, null=True, config_name='default')
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
|
||||
class ContentCreator(models.Model):
|
||||
title = models.CharField(max_length=200)
|
||||
description = CKEditor5Field('Descripción', config_name='default')
|
||||
content_type = models.CharField(max_length=60, default="Contenido general")
|
||||
subtitle = models.CharField(max_length=60, default="Nova WoW")
|
||||
youtube_video_url = models.URLField(max_length=300, blank=True, null=True)
|
||||
avatar_image_url = models.URLField(max_length=300, blank=True, null=True)
|
||||
youtube_channel_url = models.URLField(max_length=300, blank=True, null=True)
|
||||
facebook_page_url = models.URLField(max_length=300, blank=True, null=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.titles
|
||||
|
||||
class RecruitReward(models.Model):
|
||||
required_friends = models.IntegerField()
|
||||
reward_name = models.CharField(max_length=100)
|
||||
item_id = models.IntegerField()
|
||||
item_quantity = models.IntegerField(default=1)
|
||||
item_link = models.URLField()
|
||||
icon_class = models.CharField(max_length=50, help_text="Clase CSS para el icono (ej. 'icontinyl q3')")
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.required_friends} amigos - {self.reward_name}"
|
||||
|
||||
class ClaimedReward(models.Model):
|
||||
recruit_reward = models.ForeignKey(RecruitReward, on_delete=models.CASCADE, related_name='claimed_rewards')
|
||||
account_id = models.IntegerField()
|
||||
character_name = models.CharField(max_length=100)
|
||||
username = models.CharField(max_length=100)
|
||||
claimed_at = models.DateTimeField(auto_now_add=True)
|
||||
ip_address = models.GenericIPAddressField()
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.username} - {self.recruit_reward.reward_name} - {self.claimed_at}"
|
||||
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<browserconfig>
|
||||
<msapplication>
|
||||
<tile>
|
||||
<square70x70logo src="/mstile-70x70.png?v=4"/>
|
||||
<square150x150logo src="/mstile-150x150.png?v=4"/>
|
||||
<square310x310logo src="/mstile-310x310.png?v=4"/>
|
||||
<wide310x150logo src="/mstile-310x150.png?v=4"/>
|
||||
<TileColor>#211917</TileColor>
|
||||
</tile>
|
||||
</msapplication>
|
||||
</browserconfig>
|
||||
|
After Width: | Height: | Size: 662 B |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 338 B |
|
After Width: | Height: | Size: 314 B |
|
After Width: | Height: | Size: 310 B |
|
After Width: | Height: | Size: 342 B |
|
After Width: | Height: | Size: 332 B |
|
After Width: | Height: | Size: 354 B |
|
After Width: | Height: | Size: 294 B |
|
After Width: | Height: | Size: 441 B |
|
After Width: | Height: | Size: 402 B |
|
After Width: | Height: | Size: 222 B |
|
After Width: | Height: | Size: 326 B |
|
After Width: | Height: | Size: 364 B |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 760 B |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 234 B |
|
After Width: | Height: | Size: 244 B |
|
After Width: | Height: | Size: 196 B |
|
After Width: | Height: | Size: 786 B |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 548 B |
|
After Width: | Height: | Size: 574 B |
|
After Width: | Height: | Size: 386 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 138 B |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 606 B |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 230 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 452 KiB |
|
After Width: | Height: | Size: 682 B |
|
After Width: | Height: | Size: 166 KiB |
|
After Width: | Height: | Size: 203 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 5.2 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 6.8 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
@@ -0,0 +1,18 @@
|
||||
<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M68.5094 2.25529C72.3363 -0.751762 77.6637 -0.751762 81.4906 2.25529L101.148 17.7017C102.315 18.6189 103.656 19.2787 105.086 19.6395L129.159 25.7157C133.845 26.8986 137.167 31.1554 137.252 36.088L137.692 61.4255C137.718 62.9301 138.049 64.4127 138.664 65.7798L149.025 88.8031C151.042 93.2852 149.857 98.5933 146.137 101.737L127.027 117.886C125.893 118.845 124.965 120.034 124.303 121.378L113.149 144.011C110.978 148.418 106.178 150.78 101.454 149.768L77.1851 144.567C75.744 144.259 74.256 144.259 72.8149 144.567L48.5462 149.768C43.8217 150.78 39.0219 148.418 36.8506 144.011L25.6975 121.378C25.0352 120.034 24.1074 118.845 22.9727 117.886L3.86332 101.737C0.143187 98.5933 -1.04228 93.2852 0.974742 88.8031L11.3357 65.7798C11.9509 64.4127 12.282 62.9301 12.3081 61.4255L12.7478 36.088C12.8334 31.1554 16.155 26.8986 20.8414 25.7157L44.9144 19.6395C46.3438 19.2787 47.6845 18.6189 48.8518 17.7017L68.5094 2.25529Z" fill="url(#paint0_linear)"/>
|
||||
<g opacity="0.2">
|
||||
<path d="M79.3281 5.00732L98.9857 20.4538C100.536 21.6717 102.321 22.5515 104.229 23.0331L128.302 29.1093C131.412 29.8942 133.694 32.7501 133.753 36.1487L134.192 61.4863C134.227 63.4636 134.662 65.4145 135.473 67.2161L145.834 90.2394C147.218 93.3153 146.389 96.9412 143.878 99.0638L124.768 115.213C123.262 116.485 122.036 118.059 121.163 119.831L110.01 142.464C108.531 145.466 105.306 147.014 102.187 146.345L77.9184 141.145C75.9939 140.733 74.006 140.733 72.0816 141.145L47.8129 146.345C44.6935 147.014 41.4694 145.466 39.9901 142.464L28.837 119.831C27.9637 118.059 26.7376 116.485 25.2318 115.213L6.12245 99.0638C3.61065 96.9412 2.78225 93.3153 4.16644 90.2394L14.5274 67.2161C15.3382 65.4145 15.7733 63.4636 15.8076 61.4863L16.2472 36.1487C16.3062 32.7501 18.5883 29.8942 21.698 29.1093L45.771 23.0331C47.6792 22.5515 49.4642 21.6717 51.0143 20.4538L70.6719 5.00732C73.2296 2.99756 76.7704 2.99756 79.3281 5.00732Z" stroke="black" stroke-width="7"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip0)">
|
||||
<path d="M52.708 112.844C52.4 112.844 52.092 112.69 51.784 112.536C51.322 112.228 51.014 111.458 51.168 110.842L57.944 85.586L37.616 69.108C37 68.8 36.846 68.03 37 67.414C37.154 66.798 37.77 66.336 38.386 66.336L64.566 64.95L73.96 40.464C74.268 40.002 74.884 39.54 75.5 39.54C76.116 39.54 76.732 40.002 76.886 40.464L86.28 64.95L112.46 66.336C113.076 66.336 113.692 66.798 113.846 67.414C114 68.03 113.846 68.646 113.384 69.108L93.056 85.586L99.832 110.842C99.986 111.458 99.832 112.074 99.216 112.536C98.754 112.844 97.984 112.998 97.522 112.536L75.5 98.368L53.478 112.536C53.17 112.844 53.016 112.844 52.708 112.844Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear" x1="0" y1="0" x2="150" y2="150" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.104167" stop-color="#1A9480"/>
|
||||
<stop offset="0.901042" stop-color="#DFB311"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0">
|
||||
<rect width="77" height="77" fill="white" transform="translate(37 38)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.0 KiB |