Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feedback #1

Open
wants to merge 128 commits into
base: feedback
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
128 commits
Select commit Hold shift + click to select a range
98ff35d
Setting up GitHub Classroom Feedback
github-classroom[bot] Apr 28, 2024
f1ae4a6
Regist
Mutths May 7, 2024
d0b4f6b
Add files via upload
16523142 May 7, 2024
e3020ea
Update Regist
16523142 May 7, 2024
933226e
feat: save
iqbalhaidr May 8, 2024
5d07aef
Merge pull request #2 from Labpro-21/feat/save
iqbalhaidr May 8, 2024
c79339d
fix: remove unused lines
iqbalhaidr May 8, 2024
dc57b25
feat: load
iqbalhaidr May 9, 2024
13bc76f
Merge pull request #3 from Labpro-21/feat/load
iqbalhaidr May 9, 2024
0666d55
feat: shop management
iqbalhaidr May 12, 2024
bd525bc
Add files via upload
Mutths May 12, 2024
f968b71
Add files via upload
Mutths May 12, 2024
ee58883
Update and rename Regist to regist.py
16523142 May 12, 2024
82756eb
Add files via upload
16523142 May 12, 2024
9499dbf
Add files via upload
jovan196 May 14, 2024
8b24681
Add files via upload
jovan196 May 14, 2024
05b80f2
Add files via upload
jovan196 May 14, 2024
cfdbd5b
Ralat F16_Exit.py
jovan196 May 14, 2024
c19f342
Update and rename F10_Shop&Currency.py to F10.py
jovan196 May 14, 2024
b2e3257
Update F10.py
jovan196 May 14, 2024
fb7fe94
Assign Lists As Parameters F10.py
jovan196 May 14, 2024
b64a157
Add Comment to Import F10.py
jovan196 May 14, 2024
8d04320
Agent Validation
jovan196 May 16, 2024
5454378
feat: ShopManagement
iqbalhaidr May 16, 2024
4ac884e
Delete F12.py
iqbalhaidr May 16, 2024
87935a8
Add files via upload
jovan196 May 16, 2024
7a0e6fb
feat: Load with argparse
iqbalhaidr May 16, 2024
1fb2bba
Delete F14_Load.py
iqbalhaidr May 16, 2024
56f1460
feat: save
iqbalhaidr May 16, 2024
579dccb
Delete F15_Save.py
iqbalhaidr May 16, 2024
60ed69a
feat: add default database
iqbalhaidr May 16, 2024
41344af
Add files via upload
Mutths May 16, 2024
42c748c
Delete src/F14.py
jovan196 May 16, 2024
b0a98bf
Add files via upload
jovan196 May 16, 2024
70465ec
Add files via upload
jovan196 May 16, 2024
ff51d4b
Update F16_Exit.py
jovan196 May 16, 2024
0bcf669
Add files via upload
jovan196 May 16, 2024
a407940
Update F04.py
jovan196 May 16, 2024
87bb710
Add files via upload
jovan196 May 16, 2024
66717bb
Update F08.py
jovan196 May 16, 2024
e7c6bf9
Update F10.py
jovan196 May 16, 2024
a59dfc2
Update and rename F12_ShopManagement.py to F12.py
iqbalhaidr May 16, 2024
9fba966
feat: shop managment
iqbalhaidr May 16, 2024
4fcae7d
feat: load with argparse
iqbalhaidr May 16, 2024
9af9015
feat: save
iqbalhaidr May 16, 2024
0be48b3
feat: shop management
iqbalhaidr May 16, 2024
6f7dd46
Update F14.py
jovan196 May 17, 2024
a4e9e73
Update F14.py
jovan196 May 17, 2024
56ddc4d
Update F05.py
jovan196 May 17, 2024
b92251a
Update F06.py
jovan196 May 17, 2024
9b1f557
Validate Last Row F14.py
jovan196 May 17, 2024
fa6e6ab
Implement Custom IsDigit
jovan196 May 17, 2024
c3c1046
Update F10.py
jovan196 May 17, 2024
a47374b
Update F04.py
jovan196 May 17, 2024
701c18c
Update F16.py
jovan196 May 17, 2024
cb64e75
Update F10.py
jovan196 May 17, 2024
ca40045
Update main.py
jovan196 May 17, 2024
c7ae4dd
Add files via upload
jovan196 May 17, 2024
ead2532
Create F02.py
syauqimfatih May 17, 2024
2386777
Add files via upload
syauqimfatih May 17, 2024
abdc1c7
Update F05.py
jovan196 May 17, 2024
42177cf
Add files via upload
jovan196 May 17, 2024
cc0cbe7
Update F08.py
jovan196 May 17, 2024
c3b9500
Update F02.py
jovan196 May 17, 2024
eec69cf
Update F02.py
jovan196 May 17, 2024
fc5395d
Update F02.py
jovan196 May 17, 2024
786a2bb
Add files via upload
jovan196 May 18, 2024
5b2f7e9
Update main.py
jovan196 May 18, 2024
f9dbed4
Update F07.py
jovan196 May 18, 2024
88bd001
Update F08.py
jovan196 May 18, 2024
f19deef
Update F09.py
jovan196 May 18, 2024
aecca57
Update F10.py
jovan196 May 18, 2024
2892ac0
Update F01.py
jovan196 May 19, 2024
b5775a7
Update F02.py
jovan196 May 19, 2024
3008d60
Add files via upload
jovan196 May 19, 2024
eeb3af5
Update F05.py
jovan196 May 19, 2024
36fb197
Update F07.py
jovan196 May 19, 2024
e3a8517
Update F08.py
jovan196 May 19, 2024
090798a
Update F09.py
jovan196 May 19, 2024
46c872e
Update F10.py
jovan196 May 19, 2024
3448502
Update main.py
jovan196 May 19, 2024
10317f0
Add files via upload
jovan196 May 19, 2024
9d3f106
Update F07.py
jovan196 May 19, 2024
5f2bfd4
Update F04.py
jovan196 May 19, 2024
ab4cac8
Add files via upload
jovan196 May 19, 2024
bd87921
Update F08.py
jovan196 May 19, 2024
2b37b77
Update F09.py
jovan196 May 19, 2024
a434321
Update main.py
jovan196 May 19, 2024
f5734c4
Update F12.py
jovan196 May 19, 2024
705b2e9
Update F02.py
jovan196 May 19, 2024
758d483
Update main.py
jovan196 May 19, 2024
686338c
feat: validation for folder input
iqbalhaidr May 19, 2024
b985683
Update F01.py
jovan196 May 19, 2024
9b2e0a4
Update F04.py
jovan196 May 19, 2024
d53fdf6
Update F07.py
jovan196 May 19, 2024
75adeed
feat: input validation
jovan196 May 19, 2024
3f40d45
Update F09.py
jovan196 May 19, 2024
39984fd
feat: input validation
jovan196 May 19, 2024
8687a91
feat: input validation
jovan196 May 19, 2024
eea0013
feat: input validation
jovan196 May 19, 2024
65116e5
Update F09.py
jovan196 May 19, 2024
9580692
Update F10.py
jovan196 May 19, 2024
bbdbc66
Delete F00 RNG.py
jovan196 May 19, 2024
d5cf84b
Delete F02.py
jovan196 May 19, 2024
8b1f01e
Delete F04.py
jovan196 May 19, 2024
514617a
Delete F10.py
jovan196 May 19, 2024
e1d8a85
Delete F16_Exit.py
jovan196 May 19, 2024
4353748
Delete item_inventory.csv
jovan196 May 19, 2024
c73a5c7
Delete logout.py
jovan196 May 19, 2024
af1499b
Delete monster.csv
jovan196 May 19, 2024
1000e7f
Delete monster_inventory.csv
jovan196 May 19, 2024
ce4e170
Delete regist.py
jovan196 May 19, 2024
2022621
Delete user.csv
jovan196 May 19, 2024
38c59e8
Update F04.py
jovan196 May 20, 2024
20efa26
Update F02.py
jovan196 May 20, 2024
c845de1
Update main.py
jovan196 May 20, 2024
681ad62
Update F02.py
jovan196 May 20, 2024
7cba3c2
Update F02.py
jovan196 May 20, 2024
45f1506
Update F09.py
jovan196 May 20, 2024
986d8be
Add files via upload
16523142 May 20, 2024
f4c02c5
Update README.md
jovan196 May 20, 2024
c0ab6e6
Update README.md
jovan196 May 20, 2024
157dc06
Update README.md
jovan196 May 20, 2024
3fdbb1d
add: laporan
jovan196 May 20, 2024
d6ce7eb
Rename Laporan Tugas Besar DASPRO.pdf to IF1210_LaporanTB_K[02-H]
16523142 May 20, 2024
52c36e0
Rename IF1210_LaporanTB_K[02-H] to IF1210_LaporanTB_K[02-H].pdf
jovan196 May 20, 2024
539f371
Update main.py
jovan196 May 24, 2024
983e5ca
Update F02.py
jovan196 May 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 29 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,37 @@
> Tugas Besar - IF1210 Dasar Pemrograman 2024

# About
> Program Game Fungsional Monster

# Contributors
Jovandra Otniel P. S. (19623032)<br />
Muhammad Iqbal Haidar (19623242)<br />
Teresa Dillen Tshia (16523142)<br />
Muthia Nabilla Azzahra (16523012)<br />
Syauqi Muhammad Fatih (16523272)

# Features
Register: Menambah akun baru<br />
Login: Masuk dengan akun<br />
Logout: Keluar dari akun<br />
Help: Menampilkan bantuan berdasarkan role akun (admin/agent)<br />

# How to Run
Inventory: Menampilkan monster dan potion agent<br />
Battle: Mempertarungkan monster agent dengan monster lawan (CPU)<br />
Arena: Melatih kekuatan monster agent dengan monster lawan (CPU)<br />
Shop: Membeli monster dan potion dari toko (agent)<br />
Lab: Meningkatkan level monster dari agent<br />

Shop Management: Mengubah etalase toko (admin)<br />
Monster Management: Menambahkan daftar monster di game (admin)<br />

Load: Memuat data CSV dari folder ```data/(nama_folder)```<br />
Save: Menyimpan data CSV ke folder ```data/(data_folder)```<br />
Exit: Keluar dari program

# How to Run
1. Jalankan main.py di terminal dengan perintah ```py main.py dataset_default``` dengan ```dataset_default``` dapat diganti dengan nama folder lain dalam folder ```data```.<br />
2. Masukkan feature yang ingin dijalankan.<br />
3. Beberapa fitur memerlukan user login terlebih dahulu.<br />
4. Beberapa fitur hanya memperbolehkan user dengan role tertentu untuk bisa dijalankan.<br />
5. Untuk keluar dari game, ketik ```quit``` pada program utama.
6 changes: 6 additions & 0 deletions data/dataset_default/item_inventory.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
user_id;type;quantity
2;strength;5
2;resilience;3
3;resilience;7
4;healing;3
5;strength;20
4 changes: 4 additions & 0 deletions data/dataset_default/item_shop.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
type;stock;price
strength;10;50
resilience;5;30
healing;3;20
6 changes: 6 additions & 0 deletions data/dataset_default/monster.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
id;type;atk_power;def_power;hp
1;Pikachow;125;10;600
2;Bulbu;50;50;1200
3;Zeze;300;10;100
4;Zuko;100;25;800
5;Chacha;80;30;700
6 changes: 6 additions & 0 deletions data/dataset_default/monster_inventory.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
user_id;monster_id;level
2;1;1
3;2;2
3;3;1
4;4;1
5;5;5
6 changes: 6 additions & 0 deletions data/dataset_default/monster_shop.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
monster_id;stock;price
1;10;500
2;4;700
3;3;1000
4;8;550
5;7;600
6 changes: 6 additions & 0 deletions data/dataset_default/user.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
id;username;password;role;oc
1;Mr_Monogram;monogrammer77;admin;0
2;Asep_Spakbor;asepwow123;agent;9999
3;Agen_P;platypus123;agent;0
4;B4ngk1dd0ssss;bangkitganteng;agent;1337
5;Kenny_agen_rahasia;kribogeming55;agent;6699
Binary file added doc/IF1210_FormAsistensiTB_[1]_K[02-H].docx.pdf
Binary file not shown.
Binary file added doc/IF1210_FormAsistensiTB_[2]_K[02-H].docx.pdf
Binary file not shown.
Binary file added doc/IF1210_LaporanTB_K[02-H].pdf
Binary file not shown.
80 changes: 80 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
from src.F01 import register
from src.F02 import login
from src.F03 import logout
from src.F04 import help
from src.F05 import custom_zip
from src.F07 import inventory
from src.F08 import battle
from src.F09 import arena
from src.F10 import shop
from src.F11 import laboratory
from src.F12 import shop_management
from src.F13 import monster_management
from src.F14 import load
from src.F15 import save
from src.F16 import exit_game

li_user, li_monster, li_item, li_item_inventory, li_monster_inventory, li_item_shop, li_monster_shop = load()
login_id = None # Asumsi user login

while True:
a = input("register/login/logout/help/inventory/battle/arena/shop/lab/shop_mgmt/monster_mgmt/save/quit: ").lower()
if a == 'register':
li_user,li_monster_inventory = register(li_user,li_monster,li_monster_inventory)
elif a == 'login':
login_id = login(login_id,li_user)
elif a == 'logout':
login_id = logout(login_id)
elif a == 'help':
help(login_id,li_user)
elif a == 'inventory':
inventory(login_id,li_user,li_monster,li_item_inventory,li_monster_inventory)
elif a == 'battle':
li_user,li_monster,li_item_inventory,li_monster_inventory = battle(login_id,li_user,li_monster,li_item_inventory,li_monster_inventory)
elif a == 'arena':
li_user,li_monster,li_item_inventory,li_monster_inventory = arena(login_id,li_user,li_monster,li_item_inventory,li_monster_inventory)
elif a == 'shop':
li_user,li_monster,li_item_inventory,li_monster_inventory,li_item_shop,li_monster_shop = shop(login_id,li_user,li_monster,li_item_inventory,li_monster_inventory,li_item_shop,li_monster_shop)
elif a == 'lab':
li_user,li_monster_inventory = laboratory(login_id,li_user,li_monster,li_monster_inventory)
elif a == 'shop_mgmt':
headers = li_user[0]
data = []
for i in range(1,len(li_user)):
data.append(li_user[i])
user_data = [dict(custom_zip(headers, row)) for row in data]
if login_id:
user_login = [u for u in user_data if u['id'] == int(login_id)]
if user_login:
user_login = user_login[0]
role = str(user_login['role']).lower()
if role != 'admin':
print("Yah, hanya admin saja yang boleh masuk Shop Management.")
else:
li_monster, li_monster_shop, li_item_shop = shop_management(li_monster, li_item, li_monster_shop, li_item_shop)
else:
print("Anda belum login!")
elif a =='monster_mgmt':
headers = li_user[0]
data = []
for i in range(1,len(li_user)):
data.append(li_user[i])
user_data = [dict(custom_zip(headers, row)) for row in data]
if login_id:
user_login = [u for u in user_data if u['id'] == int(login_id)]
if user_login:
user_login = user_login[0]
role = str(user_login['role']).lower()
if role != 'admin':
print("Yah, hanya admin saja yang boleh masuk Monster Management.")
else:
li_monster = monster_management(li_monster)
else:
print("Anda belum login!")
elif a == 'save':
save(li_user, li_monster, li_item_inventory, li_monster_inventory, li_item_shop, li_monster_shop)
elif a == 'quit' or a == 'exit':
exit_game(li_user, li_monster, li_item_inventory, li_monster_inventory, li_item_shop, li_monster_shop)
else:
continue

11 changes: 11 additions & 0 deletions src/F00.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
def random_num(min_value, max_value):
import time
seed = time.time()

a = 110351524512
c = 12345
m = 2**31

random_number = ((seed * a + c) % m) / (m - 1)

return int(random_number * (max_value - min_value + 1)) + min_value
99 changes: 99 additions & 0 deletions src/F01.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
def check_valid(username):
acceptable_chars = set("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-")
return all(char in acceptable_chars for char in username)

def register(list_user,list_monster,list_monster_inventory):
from src.F05 import custom_zip
from src.F05 import custom_isdigit
list_user = [[str(item) for item in row] for row in list_user]
list_monster = [[str(item) for item in row] for row in list_monster]
list_monster_inventory = [[str(item) for item in row] for row in list_monster_inventory]

headers = list_user[0]
data = []
for i in range(1,len(list_user)):
data.append(list_user[i])
user_data = [dict(custom_zip(headers, row)) for row in data]


headers = list_monster[0]
data = []
for i in range(1,len(list_monster)):
data.append(list_monster[i])
monster_data = [dict(custom_zip(headers, row)) for row in data]

headers = list_monster_inventory[0]
data = []
for i in range(1,len(list_monster_inventory)):
data.append(list_monster_inventory[i])
monster_inventory = [dict(custom_zip(headers, row)) for row in data]

new_user_id = 1
# User input for registration
while True:
username = input("Masukkan username: ")
if not check_valid(username):
print("Username hanya boleh mengandung huruf kapital/kecil, angka ,garis bawah _, dan garis hubung -")
continue
full = False
for user in user_data:
if user['username'] == username:
print("Username sudah terdaftar! Silakan coba masukkan username lain")
full = True
continue
if full:
continue
password = input("Masukkan password: ")
for user in user_data:
while user['id'] == str(new_user_id):
new_user_id += 1
break
while True:
print("Pilih monster sebagai monster awalmu:")
for monster in monster_data:
print(f"{monster['id']}. {monster['type']}")
monster_benar = False
selected_monster_id = input("Masukkan ID monster yang ingin dipilih: ")
if not custom_isdigit(selected_monster_id):
print("Masukkan format valid!")
continue
for monster in monster_data:
if monster['id'] == str(selected_monster_id):
monster_benar = True
if not monster_benar:
print("Monster ID tidak ada! Silakan masukkan ID monster yang tersedia.")
continue
new_user = {
'id': str(new_user_id),
'username': username,
'password': password,
'role' : 'agent',
'oc': '0'
}
user_data.append(new_user)

# Add selected monster to monster_inventory
new_inventory = {
'user_id': new_user_id,
'monster_id': selected_monster_id,
'level': '1'
}
monster_inventory.append(new_inventory)
break

# Write updated data
headers = list(user_data[0].keys())
list_user = [headers] + [[d[key] for key in headers] for d in user_data]

headers = list(monster_inventory[0].keys())
list_monster_inventory = [headers] + [[d[key] for key in headers] for d in monster_inventory]

list_user = [[int(item) if custom_isdigit(item) else item for item in row] for row in list_user]
list_monster_inventory = [[int(item) if custom_isdigit(item) else item for item in row] for row in list_monster_inventory]

print(f"User {username} successfully registered with user ID {new_user_id} and selected monster ID {selected_monster_id}")
return list_user,list_monster_inventory

# Call the register function to register a new user and update the monster inventory
# from src.F01 import register
# li_user,li_monster_inventory = register(li_user,li_monster,li_monster_inventory)
28 changes: 28 additions & 0 deletions src/F02.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
def login(login_id,list_user):
if login_id:
print("Anda sudah login")
return login_id
username = input("Masukkan username: ")
user_found = False
for i in range (0, len(list_user)):
if username == list_user[i][1]:
user_found = True
password = input("Masukkan password: ")
if password == list_user[i][2]:
print(f"Selamat datang {list_user[i][3]} {list_user[i][1]}")
user_id = list_user[i][0]
return str(user_id)
else:
print("Password salah")
return None
else:
continue
if not user_found:
print("Username tidak ditemukan")
return None


# Aplikasi pada main.py

# from src.F02 import *
# login_id = login(li_user) # login_id dipakai sebagai variabel global di main.py untuk menentukan kepemilikan item, akses fungsi tertentu, dan status login user
12 changes: 12 additions & 0 deletions src/F03.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
def logout(login_id):
if login_id:
print("Kamu telah logout")
return None
else:
print("Tidak bisa logout karena kamu belum login")
return

# Aplikasi pada main.py

# from src.F03 import *
# login_id = logout(login_id) # login_id dipakai sebagai variabel global di main.py untuk menentukan kepemilikan item, akses fungsi tertentu, dan status login user
61 changes: 61 additions & 0 deletions src/F04.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
def help(login_id,list_user):
from src.F05 import custom_zip
list_user = [[str(item) for item in row] for row in list_user]

headers = list_user[0]
data = []
for i in range(1,len(list_user)):
data.append(list_user[i])
user_data = [dict(custom_zip(headers, row)) for row in data]
user_data = [u for u in user_data if u['id'] == str(login_id)] # Filter username yang terlogin

if not login_id: # Jika belum login
print("Kamu belum login sebagai role apapun. Silahkan login terlebih dahulu.\n")
print("Login: Masuk ke dalam akun yang sudah terdaftar\n")
print("Register: Membuat akun baru\n")
print("Quit: Keluar dari game\n")
print("\nFootnote:")
print("Untuk menggunakan aplikasi, silahkan masukkan nama fungsi yang terdaftar\n")
print("Jangan lupa untuk memasukkan input yang valid")
return

user_data = user_data[0] # To select the user data dictionary

role = str(user_data['role']).lower() # Mencari role user
if role == 'agent':
print("Halo Agent Purry. Kamu memanggil command HELP. \nKamu memilih jalan yang benar, semoga kamu tidak sesat kemudian. \nBerikut adalah hal-hal yang dapat kamu lakukan sekarang:")
print("Logout: Keluar dari akun yang sedang digunakan\n")
print("Inventory: Melihat owca-dex yang dimiliki oleh Agent\n")
print("Battle: Memulai pertarungan dengan monster lain\n")
print("Arena: Melatih monster Agent di Arena\n")
print("Shop: Melihat dan membeli potion dan monster yang dijual\n")
print("Lab: Meningkatkan level monster Agent\n")
print("Save: Menyimpan data game\n")
print("Quit: Keluar dari game\n")
# Add more commands or actions
print("\nFootnote:")
print("Untuk menggunakan aplikasi, silahkan masukkan nama fungsi yang terdaftar\n")
print("Jangan lupa untuk memasukkan input yang valid")
elif role == 'admin':
print("Selamat datang, Admin. Berikut adalah hal-hal yang dapat lakukan:\n")
print("Logout: Keluar dari akun yang sedang digunakan\n")
print("Shop_mgmt: Melakukan manajemen pada SHOP sebagai tempat jual beli peralatan Agent\n")
print("Monster_mgmt: Melakukan manajemen pada MONSTER yang tersedia di game\n")
print("Save: Menyimpan data game\n")
print("Quit: Keluar dari game\n")
# Add more commands or actions
print("\nFootnote:")
print("Untuk menggunakan aplikasi, silahkan masukkan nama fungsi yang terdaftar")
print("Jangan lupa untuk memasukkan input yang valid")
else:
print("Kamu belum login sebagai role apapun. Silahkan login terlebih dahulu.")
print("Login: Masuk ke dalam akun yang sudah terdaftar")
print("Register: Membuat akun baru")
print("\nFootnote:")
print("Untuk menggunakan aplikasi, silahkan masukkan nama fungsi yang terdaftar")
print("Jangan lupa untuk memasukkan input yang valid")

# Aplikasi fungsi help pada file main.py

# from src.F04 import help
# help(login_id,li_user)
Loading