A basic chat program

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 " or
“channel2 " 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.

On 10/17/06, Michael H. [email protected] wrote:

{“<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.

Michael,

Jon L. 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

Jan S. wrote:

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.

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/

On 10/17/06, Justin C. [email protected] wrote:

require ‘gserver’
user = User.new(io)

[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

On Oct 16, 2006, at 5:24 PM, Michael H. wrote:

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 G. II