[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

A basic chat program

Michael Hall

10/16/2006 10:25:00 PM

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

5 Answers

Jano Svitok

10/16/2006 10:47:00 PM

0

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.

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

George Oliver

10/17/2006 12:54:00 AM

0

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


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

Justin Collins

10/17/2006 1:07:00 AM

0

Jan Svitok wrote:
> 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.
>
> 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/...
[2]http://ruby-doc.org/stdlib/libdoc/observer/rdoc/...
[3]http://yaml4r.sourceforg...



hemant

10/17/2006 1:22:00 AM

0

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/...
> [2]http://ruby-doc.org/stdlib/libdoc/observer/rdoc/...
> [3]http://yaml4r.sourceforg...
>
>
>
>


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

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

James Gray

11/9/2006 9:34:00 PM

0

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.

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

James Edward Gray II