A basic chat program

M

Michael Hall

Okay I'm looking to make a basic chat program that I can connect to via
telnet for learning purposes.

I want a user to connect then login in or be able to create a new user,
new users would be saved as files. then when they're in the program they
can talk on different channels by typing "channel1 <message>" or
"channel2 <message>" etc. Also I'd like to put the code in different
files i.e. connection/login/user create code in one file, the
channel/talk functions in another and in a third file a list of the
commands that can be typed pointing to the function name (like
{"<command", function_name} so that when they type the command that's
listed there it will find the correct function and run it) I need help
on how to go about this, psuedo code, code examples etc.
 
J

Jan Svitok

Okay I'm looking to make a basic chat program that I can connect to via
telnet for learning purposes.

I want a user to connect then login in or be able to create a new user,
new users would be saved as files. then when they're in the program they
can talk on different channels by typing "channel1 <message>" or
"channel2 <message>" etc. Also I'd like to put the code in different
files i.e. connection/login/user create code in one file, the
channel/talk functions in another and in a third file a list of the
commands that can be typed pointing to the function name (like
{"<command", function_name} so that when they type the command that's
listed there it will find the correct function and run it) I need help
on how to go about this, psuedo code, code examples etc.

Have a look at Socket::TCPServer in stdlib. That would be the base for
your server.
 
G

georgeoliverGO

Michael,

Jon Lambert is developing a mud server which should have most of the
functionality and architecture you're looking for, it would be a good
example to see how things are put together.

Unfortunately Lambert's servers are offline and I don't know when
they're coming back on; however there is an archive of the 07-07-2006
2.10 release at this site:

http://www.mudmagic.com/codes/server-snippet/2437


best, George
 
J

Justin Collins

Jan said:
Have a look at Socket::TCPServer in stdlib. That would be the base for
your server.

You may also want to look at GServer[1] in the standard library, which
is probably simpler to use. Putting this together with the Observer[2]
class, it makes it fairly simple, as long as you are okay with handling
threads and such. I'd recommend using YAML[3] for storing your users and
their settings/passwords/etc.

For the basic idea, you might start off with something like this (simply
echoes input to everyone):

require 'gserver'
require 'observer'

class MyServer < GServer
include Observable

def initialize(port = 5555, *args)
super(port, *args)
end

def serve(io)
user = User.new(io)
self.add_observer(user)
user.add_observer(self)
user.run
end

def update(message)
changed
notify_observers(message)
end
end

class User
include Observable

def initialize(io)
@io = io
end

def update(message)
@io.puts message
end

def run
loop do
input = @io.gets
changed
notify_observers(input)
end
end
end

MyServer.new.start.join


Just run that, and connect a couple of telnet sessions to port 5555.
Type in a message and it should be echoed to everyone. Hooray!
Note that MyServer and User are both observing each other, so that the
server can echo a message from any user to all the others (including the
original sender). This simplifies having to worry about threads and
queues and such.
I hope that will give you some ideas.

-Justin

[1]http://ruby-doc.org/stdlib/libdoc/gserver/rdoc/index.html
[2]http://ruby-doc.org/stdlib/libdoc/observer/rdoc/index.html
[3]http://yaml4r.sourceforge.net/doc/
 
H

hemant

You may also want to look at GServer[1] in the standard library, which
is probably simpler to use. Putting this together with the Observer[2]
class, it makes it fairly simple, as long as you are okay with handling
threads and such. I'd recommend using YAML[3] for storing your users and
their settings/passwords/etc.

For the basic idea, you might start off with something like this (simply
echoes input to everyone):

require 'gserver'
require 'observer'

class MyServer < GServer
include Observable

def initialize(port = 5555, *args)
super(port, *args)
end

def serve(io)
user = User.new(io)
self.add_observer(user)
user.add_observer(self)
user.run
end

def update(message)
changed
notify_observers(message)
end
end

class User
include Observable

def initialize(io)
@io = io
end

def update(message)
@io.puts message
end

def run
loop do
input = @io.gets
changed
notify_observers(input)
end
end
end

MyServer.new.start.join


Just run that, and connect a couple of telnet sessions to port 5555.
Type in a message and it should be echoed to everyone. Hooray!
Note that MyServer and User are both observing each other, so that the
server can echo a message from any user to all the others (including the
original sender). This simplifies having to worry about threads and
queues and such.
I hope that will give you some ideas.

-Justin

[1]http://ruby-doc.org/stdlib/libdoc/gserver/rdoc/index.html
[2]http://ruby-doc.org/stdlib/libdoc/observer/rdoc/index.html
[3]http://yaml4r.sourceforge.net/doc/


You may also want to look into eventmachine, a really nice event
driven framework for developing network applications.

http://rubyforge.org/projects/eventmachine
 
J

James Edward Gray II

Okay I'm looking to make a basic chat program that I can connect to
via
telnet for learning purposes.

Page 533 of the Ruby Cookbook has a slim but functional chat server
in about 30 lines of Ruby code.

James Edward Gray II
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top