RkBlog

Hardware, programming and astronomy tutorials and reviews.

Django, Comet i klient IRC

Prosty klient IRCa z poziomu przeglądarki wykorzystujący architekturę comet

Na stronie oreilly.com dostępny jest prosty klient IRCa napisany w Pythonie. Za jego pomocą możemy odbierać wiadomości z danego kanału. Skrypt ten odbiera wiadomości na bieżąco - połączenie jest otwarte i trwa aż zakończymy działanie skryptu. Za pomocą cometa w prosty sposób możemy przenieść efekty działania tego skryptu na stronę www.

Oto zmodyfikowany skrypt irc.py:
import sys
import socket
import string

from pyorbited.simple import Client

orbit = Client()
orbit.event(["django, 0, /chat"],  'start')

HOST="irc.freenode.net"
PORT=6667
NICK="DjangoCometStuff"
IDENT="pytest"
REALNAME="DjangoCometStuff"
readbuffer=""

s=socket.socket( )
s.connect((HOST, PORT))
s.send("NICK %s
" % NICK)
s.send("USER %s %s bla :%s
" % (IDENT, HOST, REALNAME))
s.send('JOIN #django
')

while 1:
	readbuffer=readbuffer+s.recv(1024)
	temp=string.split(readbuffer, "
")
	readbuffer=temp.pop( )
	
	for line in temp:
		line=string.rstrip(line)
		line=string.split(line)
		print line
		orbit.event(["django, 0, /chat"], str(line))
Za jego pomocą wchodzimy na kanał "django" i każdą wiadomość wysyłamy do klienta ("django, 0, /chat") serwera orbited. Podobnie jak w przypadku chatu mamy views.py o kodzie:
from pyorbited.simple import Client

from django.shortcuts import render_to_response
from django.conf import settings
from django.http import HttpResponse

users = []
orbit = Client()

def chat_page(request):
	return render_to_response('chat.html', {})
Szablon chat.html o kodzie:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Chat</title>
    <script src="/_/orbited.js"></script>
    <script type="text/javascript" src="/site_media/ajaxroutine.js"></script>
    <link rel="stylesheet" href="/site_media/chat.css">
    <script src="/site_media/chat.js" charset="utf-8"></script>
  </head>
  <body>
    <input type="button" value="Connect" name="nickname" onClick="connect();">
    <div id="box"></div>
    <iframe id="events"></iframe>
  </body>
</html>
Oraz chat.js o kodzie:
function connect()
{
  Orbited.connect(chat_event, "django", "/chat", "0");
}


chat_event = function(data) {
  var chat_box = document.getElementById('box');
  var div = window.parent.document.createElement('div');
  div.className = "event";
  div.innerHTML = data;
  chat_box.appendChild(div);
  chat_box.scrollTop = chat_box.scrollHeight;
}
Oraz urls.py:
from django.conf.urls.defaults import *

urlpatterns = patterns('',
(r'^site_media/(.*)$', 'django.views.static.serve', {'document_root': '/ścieżka'}),
(r'^/?$', 'chat.views.chat_page'),
)
Pozostałe pliki jak w przypadku czatu. W tym przypadku kod jest uproszczony - na sztywno łączymy się z orbited jako użytkownik "django, 0, /chat". Nie ma też wysyłania wiadomości. Wystarczy teraz że uruchomimy serwer orbited (konfiguracja jak dla czatu), następnie uruchomimy serwer deweloperski djano i otworzymy stronę http://localhost:8000/ w przeglądarce, klikniemy na przycisk "Connect" i gotowe. Żeby coś się w naszym okienku pojawiło orbited musi otrzymywać/wysyłać sygnały - co dokładnie dzieje się w pliku irc.py. W oddzielnym terminalu uruchom irc.py i obserwuj pojawiające się wiadomości w otwartej stronie.
irc1
Dopracowując klienta irc.py o możliwość wysyłania wiadomości (odbieranej "z django") możliwe jest stworzenie pełnego klienta IRCa. Stosując inne protokoły jak Gadu Gadu czy Jabbera możliwe jest osiągnięcie takich samych efektów.
RkBlog

Django, 14 July 2008,

Comment article