mirror of
https://github.com/autistic-symposium/web3-starter-py.git
synced 2025-05-17 14:10:21 -04:00
137 lines
3.7 KiB
Python
137 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import sys
|
|
import random
|
|
from pathlib import Path
|
|
from dotenv import load_dotenv
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
|
|
|
|
|
|
def create_dest_dir(final_dir):
|
|
"""Crete a destination dir for NFTs"""
|
|
try:
|
|
os.mkdir("nfts")
|
|
except FileExistsError:
|
|
return
|
|
|
|
|
|
def get_config(key, env_path=None):
|
|
"""Given a key, get the value from the env file.
|
|
Arguments:
|
|
key (str)
|
|
Return:
|
|
value(str)
|
|
"""
|
|
env_path = env_path or Path('.') / '.env'
|
|
load_dotenv(dotenv_path=env_path)
|
|
value = os.getenv(key)
|
|
|
|
if not value:
|
|
print('📛 Please set {} in .env'.format(key))
|
|
sys.exit(0)
|
|
return value
|
|
|
|
|
|
def open_trait_file(filename):
|
|
"""Open a file with a list of trait strings and return that list.
|
|
Arguments:
|
|
filename (str) - file to be open
|
|
Return:
|
|
items(list) - content of the file
|
|
"""
|
|
items = []
|
|
try:
|
|
with open(filename, "r") as f:
|
|
items = f.readlines()
|
|
items = [line.rstrip('\n') for line in items]
|
|
except IOError:
|
|
print("Could not open {}".format(filename))
|
|
sys.exit(1)
|
|
|
|
return items
|
|
|
|
|
|
def save_image(nft_num, this_nft):
|
|
"""Save the the list of strings in a NFT into an image.
|
|
Arguments:
|
|
nft_num(str) - this NFT id
|
|
this_nft(str) - the content of this nft
|
|
"""
|
|
img = Image.new('RGB', (600, 600), color=(255, 255, 255))
|
|
d = ImageDraw.Draw(img)
|
|
|
|
fnt = ImageFont.truetype("Roboto-Medium.ttf", 30)
|
|
d.text((20, 150), this_nft, font=fnt, fill=(0, 0, 0))
|
|
d.text((550, 30), "#{}".format(str(nft_num)), font=fnt, fill=(0, 0, 0))
|
|
|
|
try:
|
|
nft_name = "nft_{}.png".format(str(nft_num))
|
|
img.save(nft_name)
|
|
except:
|
|
print("Could not save {0} with {1}".format(nft_num, this_nft))
|
|
|
|
|
|
def get_traits_list(num_trait_lines):
|
|
"""Return a multi-dimensional array with every trait list.
|
|
Arguments:
|
|
num_trait_lines(str) - the number of trait lines in one nft
|
|
Returns:
|
|
the final string for NFT
|
|
"""
|
|
trait_file_str = get_config("TRAIT_FILE_STR")
|
|
traits_list = []
|
|
|
|
for n in range(int(num_trait_lines)):
|
|
trait_file = trait_file_str.format(n)
|
|
traits_list.append(open_trait_file(trait_file))
|
|
|
|
return traits_list
|
|
|
|
|
|
def get_this_nft(num_trait_lines, traits_list):
|
|
""" Get the random content of one NFT.
|
|
Arguments:
|
|
num_trait_lines (str) - the number of trait lines in one nft
|
|
traits_list (list) - multi-dimensional list with all traits
|
|
Return:
|
|
this_nft (list) - what composes the current NFT
|
|
"""
|
|
this_nft = []
|
|
for n in range(int(num_trait_lines)):
|
|
this_trait_list = traits_list[n]
|
|
random_trait_n = random.randint(0, len(this_trait_list)-1)
|
|
random_trait_str = this_trait_list[random_trait_n]
|
|
this_nft.append(random_trait_str)
|
|
|
|
return "\n".join(this_nft)
|
|
|
|
|
|
def generate_nfts(num_edition, num_trait_lines, traits_list):
|
|
"""Create and save NFT images
|
|
Arguments:
|
|
num_edition(str) - num of NFTs to be generated
|
|
num_trait_lines (str) - the number of trait lines in one nft
|
|
traits_list (list) - multi-dimensional list with all traits
|
|
"""
|
|
for n in range(1, int(num_edition) + 1):
|
|
this_nft = get_this_nft(num_trait_lines, traits_list)
|
|
save_image(n, this_nft)
|
|
|
|
|
|
def main():
|
|
|
|
num_trait_lines = get_config("NUM_TRAIT_LINES")
|
|
final_dir = get_config("FINAL_DIR")
|
|
num_edition = get_config("NUM_EDITION")
|
|
|
|
create_dest_dir(final_dir)
|
|
traits_list = get_traits_list(num_trait_lines)
|
|
|
|
generate_nfts(num_edition, num_trait_lines, traits_list)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|