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

···

--
Posted via http://www.ruby-forum.com/.

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

···

On 10/17/06, Michael Hall <logarkh@gmail.com> wrote:

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.

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

Michael Hall wrote:

···

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.

--
Posted via http://www.ruby-forum.com/\.

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

James Edward Gray II

···

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

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

Jan Svitok wrote:

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.

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, Michael Hall <logarkh@gmail.com> wrote:

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

http://rubyforge.org/projects/eventmachine

···

On 10/17/06, Justin Collins <collinsj@seattleu.edu> wrote:

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/

--
There was only one Road; that it was like a great river: its springs
were at every doorstep, and every path was its tributary.