Untitled

 avatar
unknown
plain_text
a year ago
14 kB
1
Indexable
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <stdbool.h>

struct Member
{
    char name[100];
    int age;
    char email[100];
    char username[100];
    char password[100];
    struct Member *next;
};

void printColoredText(char *text, int color, bool animated)
{
    HANDLE hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, color);

    if (animated)
    {
        int i;
        for (i = 0; i < strlen(text); i++)
        {
            printf("%c", text[i]);
            Sleep(50);
        }
    }
    else
    {
        printf("%s", text);
    }

    SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}

void getPassword(char *password, int maxLength)
{
    int i = 0;
    char c;

    while (1)
    {
        c = _getch();
        if (c == 13)
        {
            break;
        }
        else if (c == 8 && i > 0)
        {
            printf("\b \b");
            i--;
        }
        else if (c != 8 && i < maxLength - 1)
        {
            password[i++] = c;
            printf("*");
        }
    }

    password[i] = '\0';
}

void loadMembersFromFile(struct Member **head)
{
    FILE *file = fopen("members.csv", "r");
    if (file == NULL)
    {
        printf("Could not open file for reading.\n");
        exit(1);
    }

    char buffer[200];
    while (fgets(buffer, sizeof(buffer), file))
    {
        struct Member *newMember = (struct Member *)malloc(sizeof(struct Member));
        sscanf(buffer, "%*[^,],%*d,%*[^,],%[^,],%s", newMember->username, newMember->password);
        newMember->next = *head;
        *head = newMember;
    }

    fclose(file);
}

int authenticateUser(struct Member *head, const char *username, const char *password)
{
    while (head != NULL)
    {
        if (strcmp(username, head->username) == 0 && strcmp(password, head->password) == 0)
        {
            return 1;
        }
        head = head->next;
    }
    return 0;
}

void addMember(struct Member **head, char name[], int age, char email[], char username[], char password[])
{
    struct Member *newMember = (struct Member *)malloc(sizeof(struct Member));

    strcpy(newMember->name, name);

    newMember->age = age;

    strcpy(newMember->email, email);
    strcpy(newMember->username, username);
    strcpy(newMember->password, password);

    newMember->next = *head;
    *head = newMember;
}

void saveMembersToFile(struct Member *head)
{
    FILE *file = fopen("members.csv", "w");
    if (file == NULL)
    {
        printf("Could not open file for writing.\n");
        return;
    }

    fprintf(file, "Name,Age,Email,Username,Password\n");
    while (head != NULL)
    {
        fprintf(file, "%s,%d,%s,%s,%s\n", head->name, head->age, head->email, head->username, head->password);
        head = head->next;
    }

    fclose(file);
}

int mainMember()
{
    system("cls");

    struct Member *head = NULL;

    char name[100],
        email[100],
        username[100],
        password[100];
    int age;

    printColoredText("==================== [Register Guest] ====================\n\n", FOREGROUND_GREEN, false);
    printf("Enter your Name : ");
    scanf("%s", name);

    printf("Enter your Age: ");
    scanf("%d", &age);

    printf("Enter your Email: ");
    scanf("%s", email);

    printf("Enter your Username: ");
    scanf("%s", username);

    printf("Enter your Password: ");
    scanf("%s", password);

    addMember(&head, name, age, email, username, password);
    saveMembersToFile(head);

    printColoredText("==========================================================\n\n", FOREGROUND_GREEN, false);

    printColoredText("[!] Wait written to members.csv\n", FOREGROUND_RED, true);
    printColoredText("[!] Data has been written to members.csv\n", FOREGROUND_GREEN, true);

    return 0;
}

void UserSelectClass(int choice)
{
    if (choice == 1)
    {
        printColoredText("-> Login\n", (choice == 1) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("2. Register\n", (choice == 2) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
    }
    else
    {
        printColoredText("1. Login\n", (choice == 1) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("-> Register\n", (choice == 2) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
    }
}

void AdminSelectMainMenu(int choice)
{
    if (choice == 1)
    {
        printColoredText("-> Manage with books\n", (choice == 1) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("2. Manage with users\n", (choice == 2) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("3. Manage book status\n", (choice == 3) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
    }
    else if (choice == 2)
    {
        printColoredText("1. Manage with books\n", (choice == 1) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("-> Manage with users\n", (choice == 2) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("3. Manage book status\n", (choice == 3) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
    }
    else
    {
        printColoredText("1. Manage with books\n", (choice == 1) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("2. Manage with users\n", (choice == 2) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("-> Manage book status\n", (choice == 3) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
    }
}

void UserSelectMainMenu(int choice)
{
    if (choice == 1)
    {
        printColoredText("-> Borrow a book\n", (choice == 1) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("2. Search for books\n", (choice == 2) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("3. View my borrowing\n", (choice == 3) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("4. Manage my profile\n", (choice == 4) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("5. Exit\n", (choice == 5) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
    }
    else if (choice == 2)
    {
        printColoredText("1. Borrow a book\n", (choice == 1) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("-> Search for books\n", (choice == 2) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("3. View my borrowing\n", (choice == 3) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("4. Manage my profile\n", (choice == 4) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("5. Exit\n", (choice == 5) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
    }
    else if (choice == 3)
    {
        printColoredText("1. Borrow a book\n", (choice == 1) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("2. Search for books\n", (choice == 2) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("-> View my borrowing\n", (choice == 3) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("4. Manage my profile\n", (choice == 4) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("5. Exit\n", (choice == 5) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
    }
    else if (choice == 4)
    {
        printColoredText("1. Borrow a book\n", (choice == 1) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("2. Search for books\n", (choice == 2) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("3. View my borrowing\n", (choice == 3) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("-> Manage my profile\n", (choice == 4) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("5. Exit\n", (choice == 5) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
    }
    else
    {
        printColoredText("1. Borrow a book\n", (choice == 1) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("2. Search for books\n", (choice == 2) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("3. View my borrowing\n", (choice == 3) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("4. Manage my profile\n", (choice == 4) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
        printColoredText("-> Exit\n", (choice == 5) ? FOREGROUND_BLUE : FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, false);
    }
}

int main()
{
    int choice = 1;
    int keyPressed;

    do
    {
        system("cls");
        printColoredText("==================== [Your Online Library] ====================\n\n", FOREGROUND_GREEN, false);
        UserSelectClass(choice);
        printColoredText("\n===============================================================\n\n", FOREGROUND_GREEN, false);

        keyPressed = _getch();

        if (keyPressed == 224)
        {
            keyPressed = _getch();
            switch (keyPressed)
            {
            case 72:
                choice = (choice > 1) ? choice - 1 : choice;
                break;
            case 80:
                choice = (choice < 2) ? choice + 1 : choice;
                break;
            }
        }

    } while (keyPressed != 13);

    switch (choice)
    {
    case 1:
        system("cls");

        struct Member *members = NULL;
        loadMembersFromFile(&members);

        char inputUsername[100];
        char inputPassword[100];

        printf("Please enter username : ");
        scanf("%s", inputUsername);

        printf("Please enter password : ");
        getPassword(inputPassword, sizeof(inputPassword));

        if (authenticateUser(members, inputUsername, inputPassword))
        {
            printColoredText("\n[!] Wait for checking password.\n", FOREGROUND_RED, true);
            Sleep(1000);
            printColoredText("[!] Checking password successful.\n", FOREGROUND_GREEN, true);
            Sleep(1000);
            printColoredText("[!] Login successful.\n", FOREGROUND_GREEN, true);
            Sleep(1000);

            int choice = 1;
            int keyPressed;

            do
            {
                system("cls");
                printf("\nPlease select a topic:\n");

                AdminSelectMainMenu(choice);

                keyPressed = _getch();

                if (keyPressed == 224)
                {
                    keyPressed = _getch();
                    switch (keyPressed)
                    {
                    case 72:
                        choice = (choice > 1) ? choice - 1 : choice;
                        break;
                    case 80:
                        choice = (choice < 3) ? choice + 1 : choice;
                        break;
                    }
                }

            } while (keyPressed != 13);

            switch (choice)
            {
            case 1:
                system("cls");
                printColoredText("You choose to manage with the book.\n", FOREGROUND_GREEN, false);
            case 2:
                system("cls");
                printColoredText("You choose to manage with the user.\n", FOREGROUND_GREEN, false);
            case 3:
                system("cls");
                printColoredText("You choose to manage with the book status.\n", FOREGROUND_GREEN, false);
            }
        }
        else
        {
            printColoredText("\n[!] Login failed. Invalid Username or Password.\n", FOREGROUND_RED, true);
        }
        break;
    case 2:
        mainMember();
        break;
    }

    return 0;
}