-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMessageSender.java
More file actions
153 lines (140 loc) · 3.84 KB
/
Copy pathMessageSender.java
File metadata and controls
153 lines (140 loc) · 3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// Receive input from the user
// and send messages over IRC.
// Lawrie Matthews, 06/01/2009.
import java.net.*;
import java.util.*;
import java.io.*;
public class MessageSender extends Thread
{
Scanner scan = new Scanner(System.in);
Socket socket = null;
BufferedReader in = null;
BufferedWriter out = null;
final String CRLF = "\r\n";
public MessageSender(Socket server, BufferedReader input, BufferedWriter output)
{
socket = server;
in = input;
out = output;
}
public void run()
{
try
{
// Send nickname and user registration.
System.out.println("Sending nick");
out.write("NICK " + IRCTest.nickname + CRLF);
System.out.println("Sending user");
out.write("USER " + IRCTest.nickname + " 0 * :" + IRCTest.realname + CRLF);
out.flush();
// We always want to accept user input
while(true)
{
String message = scan.nextLine();
// Handle chat commands.
if (message.startsWith("/quit"))
{
// Send quit message, if any.
String quitmsg;
try
{
quitmsg = message.substring(message.indexOf("t")+2);
}
catch (StringIndexOutOfBoundsException e) { quitmsg = "Quit IRC."; }
out.write("QUIT :" + quitmsg + CRLF);
out.flush();
IRCTest.shutdown(socket);
}
else if (message.startsWith("/nick"))
{
// Attept to change the user's nickname.
String newnick = message.substring(6); // 6 = "/nick" and a space
out.write("NICK :" + newnick + CRLF);
out.flush();
}
else if (message.startsWith("/msg"))
{
// Private message to a user.
String target = message.substring(5); // 5 characters = "/msg" and a space
String payload = target.substring(target.indexOf(" "));
target = target.substring(0, target.indexOf(" "));
out.write("PRIVMSG " + target + " :" + payload + CRLF);
out.flush();
System.out.println("Sent to " + target + ": " + payload);
}
else if (message.startsWith("/join"))
{
// Request to join a channel.
String channel = message.substring(6); // 6 characters = "/join" and a space
channel = channel.trim(); // Whitespace is the enemy
if (channel.equals("0"))
{
/* This is a special JOIN message -
* it really means quit all channels */
out.write("JOIN 0" + CRLF);
out.flush();
IRCTest.channel = "";
}
else
{
out.write("JOIN " + channel + CRLF);
out.flush();
}
}
else if (message.startsWith("/away"))
{
// User setting AWAY status
String awaymsg = "";
try
{
awaymsg = message.substring(6); // 6 characters - "/away" and a space
}
catch (StringIndexOutOfBoundsException e)
{
// No away message specified.
}
if (awaymsg.equals(""))
{
// We don't want a colon if there's no away message.
out.write("AWAY" + CRLF);
}
else
{
out.write("AWAY :" + awaymsg + CRLF);
}
out.flush();
// The server deals with deciding if we are away or returned.
}
else if (message.startsWith("/names"))
{
// NAMES request (who can we see?)
message = message.trim();
if (message.equals("/names"))
{
// No parameters so just send request
out.write("NAMES" + CRLF);
}
else
{
// Should be a list of channels
String namesmsg = message.substring(7); // 7 = /names plus a space
out.write("NAMES :" + namesmsg + CRLF);
}
out.flush();
}
else if (message.equals("/debug"))
{
// TODO
}
else
{
// Any other typing is just chat.
out.write("PRIVMSG " + IRCTest.channel + " :" + message + CRLF);
out.flush();
System.out.println("Sent to " + IRCTest.channel + " : " + message);
}
}//while
}//try
catch (IOException e) { System.out.println(e); }
}
}