Skip to content

Commit f9086e7

Browse files
authored
Create chat.exs
1 parent 77d154b commit f9086e7

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed

chat.exs

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
defmodule ChatSimulator do
2+
defmodule User do
3+
defstruct [:username, :password]
4+
end
5+
6+
defmodule Message do
7+
defstruct [:from, :to, :content, :timestamp]
8+
end
9+
10+
def start do
11+
IO.puts("Welcome to Terminal Chat!")
12+
loop([], [], nil)
13+
end
14+
15+
# Main loop
16+
defp loop(users, messages, current_user) do
17+
if current_user do
18+
IO.puts("\nLogged in as: #{current_user.username}")
19+
IO.puts("Commands: send | inbox | logout | quit")
20+
else
21+
IO.puts("\nCommands: register | login | quit")
22+
end
23+
24+
case IO.gets("> ") |> String.trim() do
25+
"register" ->
26+
{users, current_user} = register_user(users)
27+
loop(users, messages, current_user)
28+
29+
"login" ->
30+
case login_user(users) do
31+
{:ok, user} -> loop(users, messages, user)
32+
:error -> loop(users, messages, nil)
33+
end
34+
35+
"send" when current_user != nil ->
36+
messages = send_message(current_user, users, messages)
37+
loop(users, messages, current_user)
38+
39+
"inbox" when current_user != nil ->
40+
view_inbox(current_user, messages)
41+
loop(users, messages, current_user)
42+
43+
"logout" when current_user != nil ->
44+
IO.puts("Logged out.")
45+
loop(users, messages, nil)
46+
47+
"quit" ->
48+
IO.puts("Exiting chat.")
49+
:ok
50+
51+
_ ->
52+
IO.puts("Invalid command.")
53+
loop(users, messages, current_user)
54+
end
55+
end
56+
57+
# User registration
58+
defp register_user(users) do
59+
username = IO.gets("Choose a username: ") |> String.trim()
60+
if Enum.any?(users, &(&1.username == username)) do
61+
IO.puts("Username already taken.")
62+
{users, nil}
63+
else
64+
password = IO.gets("Choose a password: ") |> String.trim()
65+
user = %User{username: username, password: password}
66+
IO.puts("Registered successfully and logged in.")
67+
{[user | users], user}
68+
end
69+
end
70+
71+
# User login
72+
defp login_user(users) do
73+
username = IO.gets("Username: ") |> String.trim()
74+
password = IO.gets("Password: ") |> String.trim()
75+
76+
case Enum.find(users, &(&1.username == username && &1.password == password)) do
77+
nil ->
78+
IO.puts("Login failed.")
79+
:error
80+
user ->
81+
IO.puts("Login successful.")
82+
{:ok, user}
83+
end
84+
end
85+
86+
# Sending a message
87+
defp send_message(from_user, users, messages) do
88+
to_user = IO.gets("To: ") |> String.trim()
89+
if Enum.any?(users, &(&1.username == to_user)) do
90+
content = IO.gets("Message: ") |> String.trim()
91+
msg = %Message{
92+
from: from_user.username,
93+
to: to_user,
94+
content: content,
95+
timestamp: DateTime.utc_now() |> DateTime.to_string()
96+
}
97+
IO.puts("Message sent.")
98+
[msg | messages]
99+
else
100+
IO.puts("User not found.")
101+
messages
102+
end
103+
end
104+
105+
# Viewing inbox
106+
defp view_inbox(user, messages) do
107+
user_messages =
108+
Enum.filter(messages, fn m -> m.to == user.username end)
109+
110+
if user_messages == [] do
111+
IO.puts("No messages.")
112+
else
113+
IO.puts("\nYour messages:")
114+
Enum.each(Enum.reverse(user_messages), fn m ->
115+
IO.puts("[#{m.timestamp}] #{m.from}: #{m.content}")
116+
end)
117+
end
118+
end
119+
end
120+
121+
ChatSimulator.start()

0 commit comments

Comments
 (0)