Biblioteka Pythona

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