Pencarian

Senin, 29 Juli 2024

Pembuatan Lisensi Online Menggunakan Python

Oke berikut ini merupakan lisensi dimana satu lisensi hanya bisa digunakan untuk satu device saja, pertama kalian perlu menyiapkan databasenya, jika sudah masukan query berikut.


CREATE TABLE serial_number (

    serial_number VARCHAR(255) PRIMARY KEY,

    expired_date TIMESTAMP,

    max_sessions INT DEFAULT 3,

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);


CREATE TABLE session (

    id SERIAL PRIMARY KEY,

    serial_number VARCHAR(255) REFERENCES serial_number(serial_number),

    session_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    device_name VARCHAR(255),

    UNIQUE(serial_number, device_name) -- Pastikan tidak ada duplikasi device_name untuk nomor seri yang sama

);


kode di atas akan membuat 2 table bernama serial_number dan session. jika sudah kita isikan dummy lisensinya sebagai contoh query berikut.


-- Menambahkan data awal ke tabel serial_number

INSERT INTO serial_number (serial_number, expired_date, max_sessions, created_at)

VALUES

    ('ABC12345', '2024-12-31 23:59:59', 3, CURRENT_TIMESTAMP),

    ('DEF67890', '2024-11-30 23:59:59', 3, CURRENT_TIMESTAMP),

    ('GHI54321', '2024-10-31 23:59:59', 2, CURRENT_TIMESTAMP);


Nah pada contoh di atas kita menambahkan 3 lisensi dengan max 3 device. jika sudah maka sekarang buat kode python untuk menanyakan lisensi tersebut sebelum memasuki program.

pertama install dulu pustaka yang dibutuhkan.


pip install psycopg2 termcolor


jika sudah buat kode berikut.

import psycopg2

from datetime import datetime

from typing import Tuple, List

import uuid

import platform

from termcolor import colored



# Konfigurasi koneksi PostgreSQL

DATABASE_CONFIG = {

    'dbname': 'postgres',

    'user': 'postgres.lipscnvlenwiebjwo',

    'password': '4tE79324jkfZLkUoa',

    'host': 'aws-0-ap-southeast-1.pooler.supabase.com',

    'port': 6543

}


def get_device_uuid() -> str:

    """Generate a UUID based on system information."""

    system_info = f"{platform.node()}_{platform.system()}_{platform.machine()}_{platform.processor()}"

    return str(uuid.uuid5(uuid.NAMESPACE_DNS, system_info))


# Fungsi untuk memeriksa apakah perangkat terdaftar di database

def check_device(device_name: str) -> Tuple[bool, str, str, int]:

    try:

        conn = psycopg2.connect(**DATABASE_CONFIG)

        cursor = conn.cursor()

        query = """

            SELECT serial_number

            FROM session

            WHERE device_name = %s

        """

        cursor.execute(query, (device_name,))

        result = cursor.fetchone()

        

        if result:

            serial_number = result[0]

            cursor.execute("""

                SELECT expired_date, max_sessions

                FROM serial_number

                WHERE serial_number = %s

            """, (serial_number,))

            serial_info = cursor.fetchone()

            expired_date = serial_info[0] if serial_info else None

            max_sessions = serial_info[1] if serial_info else 1  # Default to 1 if not set

            cursor.close()

            conn.close()

            return True, serial_number, expired_date, max_sessions

        else:

            cursor.close()

            conn.close()

            return False, '', '', 0

    except Exception as e:

        print(f"Error checking device: {e}")

        return False, '', '', 0


# Fungsi untuk memeriksa apakah nomor seri valid dan tidak kedaluwarsa

def check_serial_number(serial_number: str) -> Tuple[bool, int, str]:

    try:

        conn = psycopg2.connect(**DATABASE_CONFIG)

        cursor = conn.cursor()

        query = """

            SELECT expired_date, max_sessions 

            FROM serial_number 

            WHERE serial_number = %s

        """

        cursor.execute(query, (serial_number,))

        result = cursor.fetchone()

        cursor.close()

        conn.close()


        if result:

            expired_date = result[0]

            max_sessions = result[1] if result[1] else 1  # Default to 1 if not set

            if expired_date:

                expired_date = expired_date.replace(tzinfo=None)  # Remove timezone info for comparison

                if datetime.now() > expired_date:

                    expired_date_str = expired_date.strftime('%d-%m-%Y') if expired_date else 'N/A'

                    print("~" * 45)

                    print("The serial number has expired on", colored(f"{expired_date_str}", "yellow"))

                    return False, max_sessions, expired_date

            return True, max_sessions, expired_date

        else:

            return False, 0, ''

    except Exception as e:

        print(f"Error checking serial number: {e}")

        return False, 0, ''


# Fungsi untuk menyimpan nomor seri ke tabel session

def save_session(serial_number: str, device_name: str) -> bool:

    try:

        conn = psycopg2.connect(**DATABASE_CONFIG)

        cursor = conn.cursor()


        # Periksa tanggal expired dari serial_number

        cursor.execute("SELECT expired_date FROM serial_number WHERE serial_number = %s", (serial_number,))

        expired_date = cursor.fetchone()[0]

        expired_date = expired_date.replace(tzinfo=None)

        if datetime.now() > expired_date:

            # print("Nomor seri telah kedaluwarsa.")

            expired_date_str = expired_date.strftime('%d-%m-%Y, %H:%M') if expired_date else 'N/A'

            print(f"Serial number telah kedaluwarsa pada {expired_date_str}")

            cursor.close()

            conn.close()

            return False


        # Periksa jumlah sesi aktif untuk nomor seri ini

        cursor.execute("SELECT COUNT(*) FROM session WHERE serial_number = %s", (serial_number,))

        count = cursor.fetchone()[0]


        # Dapatkan batas maksimum sesi dari tabel serial_number

        cursor.execute("SELECT max_sessions FROM serial_number WHERE serial_number = %s", (serial_number,))

        max_sessions = cursor.fetchone()[0]


        if count >= max_sessions:

            print(f"The serial number is for ({max_sessions}) devices only.")

            cursor.close()

            conn.close()

            return False


        # Periksa apakah perangkat sudah terdaftar dengan nomor seri ini

        cursor.execute("SELECT COUNT(*) FROM session WHERE serial_number = %s AND device_name = %s", (serial_number, device_name))

        device_count = cursor.fetchone()[0]


        if device_count == 0:

            # Simpan sesi baru

            query = """

                INSERT INTO session (serial_number, device_name, session_at) 

                VALUES (%s, %s, CURRENT_TIMESTAMP)

            """

            cursor.execute(query, (serial_number, device_name))

            conn.commit()

        

        cursor.close()

        conn.close()

        return True

    except Exception as e:

        print(f"Error saving session: {e}")

        return False


# Fungsi untuk menghapus nomor seri dari tabel session

def clear_session(serial_number: str, device_name: str):

    try:

        conn = psycopg2.connect(**DATABASE_CONFIG)

        cursor = conn.cursor()

        query = "DELETE FROM session WHERE serial_number = %s AND device_name = %s"

        cursor.execute(query, (serial_number, device_name))

        conn.commit()

        cursor.close()

        conn.close()

    except Exception as e:

        print(f"Error clearing session: {e}")


# Fungsi untuk membaca informasi sesi dari tabel session

def read_session_info(serial_number: str) -> Tuple[int, List[str]]:

    try:

        conn = psycopg2.connect(**DATABASE_CONFIG)

        cursor = conn.cursor()

        query = """

            SELECT device_name, session_at

            FROM session

            WHERE serial_number = %s

        """

        cursor.execute(query, (serial_number,))

        results = cursor.fetchall()

        cursor.close()

        conn.close()


        device_names = [result[0] for result in results]

        return len(device_names), device_names

    except Exception as e:

        print(f"Error reading session info: {e}")

        return 0, []


# Fungsi utama aplikasi

def highlight_keywords(text):

    if text.startswith("Expired:"):

        return colored(text, 'cyan')

    elif text.startswith("Device Max:"):

        return colored(text, 'cyan')

    elif text.startswith("Device Status:"):

        return colored(text, 'cyan')

    elif text.startswith("Device Info:"):

        return colored(text, 'cyan')

    return text


def display_info_in_columns(tools, max_tools_per_column=2):

    columns = [tools[i:i + max_tools_per_column] for i in range(0, len(tools), max_tools_per_column)]


    # Print header

    print("\nLicense", colored("Active!", "green"))


    # Print separator

    print("~" * 100)


    # Print data tools

    for i in range(max_tools_per_column):

        row = []

        for col in columns:

            if i < len(col):

                highlighted_text = highlight_keywords(col[i])

                row.append(f"* {highlighted_text:<45}")

            else:

                row.append(" " * 24)  # Fill empty columns

        print("".join(row))


    # Print separator

    print("~" * 100)

    print("")

    return input("Enter '0' to delete the license or press Enter to continue: ")


def main():

    device_name = get_device_uuid()

    

    # Check if device is registered in the database

    device_registered, serial_number, expired_date, max_sessions = check_device(device_name)


    if device_registered:

        # Check if serial number has expired

        expired_date = expired_date.replace(tzinfo=None)

        if datetime.now() > expired_date:

            expired_date_str = expired_date.strftime('%d-%m-%Y, %H:%M') if expired_date else 'N/A'

            print(f"Serial number telah kedaluwarsa pada {expired_date_str}")

            clear_session(serial_number, device_name)

            input("")

            return

        

        expired_date_str = expired_date.strftime('%d-%m-%Y, %H:%M') if expired_date else 'N/A'

        tools = [

            f"Expired: {expired_date_str}",

            f"Device Max: {max_sessions}",

            f"Device Info: ({device_name})",

        ]

        

        # Read session information

        session_count, devices = read_session_info(serial_number)

        devices_list = ', '.join(devices)

        # tools.append(f"Device Status: {session_count} Active ({devices_list})")

        tools.append(f"Device Status: {session_count} Active")

        

        action = display_info_in_columns(tools)

        if action == '0':

            clear_session(serial_number, device_name)

            print(colored("License has been removed.", "red"), "You need to enter the serial number again when opening the app.")

            main()

            return

        else:

            print("\n"*100)

            print(colored("Welcome back!", "yellow"))

            input("Berhasil masuk!!")

        

            return


    # If the device is not registered, ask for serial number from the user

    serial_number = input(colored("License Number: ", "cyan"))

    

    # Check serial number information and maximum session limit

    is_valid, max_sessions, expired_date = check_serial_number(serial_number)

    

    if not is_valid:

        print(colored("invalid!", "red"), "Please try again.")

        main()

        return

    

    expired_date_str = expired_date.strftime('%d-%m-%Y, %H:%M') if expired_date else 'N/A'

    

    # Save new session

    if save_session(serial_number, device_name):

        tools = [

            f"Expired: {expired_date_str}",

            f"Device Max: {max_sessions}",

            f"Device Info: ({device_name})"

        ]

        

        # Read session information

        session_count, devices = read_session_info(serial_number)

        devices_list = ', '.join(devices)

        tools.append(f"Device Status: {session_count} Active")

        

        display_info_in_columns(tools)

        print(colored("session has been saved..","yellow"))

        input("Berhasil masuk!!")

    


    else:

        print(colored("The maximum number of active sessions has been reached, please remove the device beforehand..", "red"))

        main()



if __name__ == "__main__":

    main()


nah yang perlu kalian perhatikan hanyalah bagian "input("Berhasil masuk!!")" dimana disitu kalian bisa gantu ke kode pertama masuk, contohnya menjadi "menuBot()" dan import juga sebagai berikut "from bot_menu.menu import menuBot" yang artinya akan dilanjutkan pada direktori bernama bot_menu dan file bernama menu.py lalu akan menjalankan fungsi menuBot yang ada di dalam file menu.py


© 2015 [BUG] GEDEBUG All Rights Reserved.