IM Integration With XMPP4r : Part 2

In the first part, we talked less about XMPP4r and more about XMPP, this time it will be the other way around.

Now that we know that XMPP messages are XML bits of information exchanged between a client and a server via a TCP connection, we are more able to understand the purpose of XMPP4r.

What is XMPP4r?

Here is the most simple definition I came out with : XMPP4r is a ruby library that acts as a XMPP Client. Understand it that way and you won’t be confuse about what XMPP4r is supposed to do. Like any other jabber client (google talk, pidgin, etc), Xmpp4r sends, receives and manages XML messages called stanzas.

In a sense, XMPP4r is like GoogleTalk without the GUI. (And, of course, XMPP4r is not already implemented… you have to code the behavior of the client yourself). With GoogleTalk, you connect on a Jabber Server by pressing the connect button. With XMPP4r, you connect on a Jabber server that way :

The first line simply creates a new instance of the Client class. This instance represents the user itself. The 2nd line tries to establish a connection between the user and the Jabber server (somewhere.com). The 3rd line tries to authenticate the user using the following mechanisms.

  • SASL DIGEST-MD5
  • SASL PLAIN
  • Non-SASL digest

Now about the 4th line. Remember when I talked about stanzas in the first part? Well, at the 4th line, we sent our first stanza to our Jabber Server… a presence stanza. We did this because we want our server to know we are there. That way, everyone in our buddy list will know we are online and ready to chat!

Sending messages
So, what now? You are online, fine… but how can you exchange messages with people? That’s pretty simple…

Important note : You have to set the message type to “chat” because some clients will react differently depending of the message type. A Gajim user will hate you if you send him messages with a message type of “normal”, because Gajim popups a new window for every single “normal” messages it receives. On the other hand, it uses the same window for “chat” messages coming from the same user.

Ok so we know how to send a message to someone, but what if that someone is not in our buddy list? Well, simply put, it will not work. XMPP just doesn’t allow this and we all agree that it’s a good thing. Who like to be spammed?

Say we want to add john@someserver.com to our buddy list, we do :

Ok so we sent our request… what about the response? Fortunately, the line above won’t wait for a result. As you can imagine, it could get pretty long… we don’t control the answer of the person at the other end after all. This leads me to talk to you about a key feature of xmpp4r : callbacks.

Registering Callbacks

Let’s get back to our subscription request we sent to John earlier. Since we said that our line of code would NOT wait for a response, we need some other way to get that response when it will come. (that’s pretty much what callbacks are for, right?)

Because we sent a subscription request, the callback “add_update_callback” will be called as soon as the user at the other end will reply. If you want to be notified when this happens, you have to register to this callback :

Xmpp4r provides callbacks for a lot of purposes. Now if I want to be notified of the messages sent to us by others, what do I have to use? The answer is add_message_callback!

There is also a very useful callback that lets you know when the availability of someone in your buddy list change.

Note that the various callbacks in xmpp4r run within their own thread.

Well, this is the end of the 2nd part. Next part should be about the Roster helper and I also want to criticize Xmpp4r about his stability (lack of) and somewhat incomplete documentation.

Woooh! Silly me… here is an important update

Don Park and Nilu had problems with this tutorial… and it’s probably because I forgot to talk about an essential part : The subscription. To receive messages from others, you have to accept their subscription requests first! Here is how

  1. require ‘xmpp4r/roster’ (a roster is an object representing your buddy list)
  2. roster = Roster::Helper.new(client)
  3. Implement the add_subscription_request_callback that way (if you want to accept everyone) :

You should be fine now.. sorry about that

UPDATE October 21st 2008
Some interesting remarks in the comments deserved a proper update :

Nilu,

I’m sure you have your answer already, but let me explain the “running in their own thread” thing :

The callbacks are invoked in the context of the “parser thread” which is the one doing the actual “listening” of the the XML stream. When something happens in the parser thread (e.g. message stanza received), callbacks are invoked from there. So the code you have in your various callbacks are effectively executed in the parser thread context.

Like Leonardo wrote, you have to write Thread.stop in your main thread when you have set all your callbacks and other initialization stuff.

It might sound confusing, but you have to write Thread.stop to keep the current thread alive. Thread.stop will simply put the current thread into sleep mode and leave all the scheduling time to the other threads (the parser thread in our case). If you don’t write Thread.stop, everything ends when the main thread has nothing left to do.

  • http://www.javascriptkata.com Dan Simard

    It was completly clear! I’m glad you write about XMPP4R because nobody wants to talk about it… almost no documentation, no examples and no blog posts. Is XMPP4R taboo?

  • Pingback: links for 2008-01-30 « Bloggitation()

  • http://iceskysl.1sters.com/ IceskYsl

    so cool~ thx~

  • http://matrixise.blogspot.com Stephane Wirtel

    I don’t know if XMPP4R is taboo, but I am interrested by this project. A bit of documentation would be welcome.

  • http://iceskysl.1sters.com/ IceskYsl
  • http://www.myinitialsare.tk Tyler

    Hey, thanks a lot. I’ve coincidentally been playing around with this a bunch. I’ve been having a problem with status synchronization with Google Talk. For example, say I want to connect, get my status, message it to a test account, then update it. I can’t seem to get the changes to apply if I login to Google Talk from another client (say GMail) Any ideas?

  • http://www.rubyfleebie.com Frank

    @Dan,

    Yeah sometimes I wonder if Xmpp4r is taboo too… no one wants to talk about it! I have to say it is not the most actively supported gem around. I’m currently seriously thinking about writing my own for XMPP. Next step is to stop thinking about it and to actually do it :)

    @Tyler,

    Are you talking about the status itself (busy, available, etc) or the status message? We have experienced problems trying to set the status message with XMPP4r and we have simply stopped investigating on the issue.

    If you are speaking about the status itself that doesn’t update… well I’m not quite sure about the source of the problem. Maybe it has something to do with the fact that you are trying to set your status manually (technically it should work but there might be a bug in xmpp4r). Could you send me the code you are using to accomplish what you want? I would be more able to help you with your problem.

  • Pingback: roScripts - Webmaster resources and websites()

  • http://mislav.caboo.se Mislav

    Frank,

    It’s great that you’re writing about this. Both were excellent articles and I hope you’ll keep it up.

  • http://www.rubyfleebie.com Frank

    @Mislav,

    I’m glad you like the articles. There will be a 3rd part for sure (that might be the final one, but I’m not sure of yet).

    I really think IM integration is not used enough in today web applications. Some people see it as a gimmick, but to me nothing could be farther from the truth.

    Thanks for your comment

  • Pingback: Introduction to XMPP and XMPP4R for Ruby Developers | Computer & Internet()

  • Don Park

    mangled resource names?
    i connect with
    jid = JID::new(‘me@gmail.com/yin’)
    client = Client::new(jid)
    client.connect(‘talk.google.com’)
    client.auth(password)
    it took a while to figure out how to connect to talk.google.com instead of gmail.com

    and send with
    to = “me@gmail.com/yang”
    subject = “from yin to yang”
    body = “help”
    m = Message::new(to, body).set_type(:normal).set_id(’1′).set_subject(subject)
    puts “sending: #{m.inspect}”
    client.send m

    i have a ‘yang’ version of the same program to receive the message. yang never gets the message and my pidgin IM program pops up with the “help” message from
    me@gmail.com/yin04223891

    do you know whats with the extra digits in the resource name?

  • Nilu

    I was trying to implement a chat client using this tutorial but it seems that my messages do not get recieved. I am using a local host for this. The client seems to send the messages (at least it doesn’t give me any errors) but when i run an another instance of the program and try to recieve messages, the messages do not show. Any ideas as to why this may be? Thank you in advance for any help

  • http://www.rubyfleebie.com Frank

    @Don Park,

    Sorry for the late answer. The digits after the resource name is an auto-generated ID… you do not have control over it. I believe it gets assigned by your Jabber server (in this case, talk.google.com).

    Now about the problem you are facing, I realize I forgot to include something important in my article..shame on me. You have to subscribe to the other contact. I update the original post, look above.

    @Nilu,

    It is probably my fault for that again! I forgot to talk about the subscription part.. look at the end of this post… I wrote an update. I’m sorry about that

  • Nilu

    Thanks for the update! :D

  • Nilu

    I also found out that Client class does not contain ‘add_update_callback’ the Rsoter::Helper class does…

  • Nilu

    You said that the callbacks are in a separate thread, so then how will the main thread (which is the client) actually receive the message? How would it communicate with the client? I don’t seem to be able to receive messages, although i can send them successfully even when i use the roster.

  • http://namakajiri.net Leonardo Boiko

    @Nilu: I had the same problem as you. Looking at the examples that came with the debian package libxmpp4r-ruby-doc, I found this:

    Thread.stop
    client.close

    next to the end of the script, after you set your callbacks. Works for me. See echo_threaded.rb for more.

  • bino

    Well … Sometime a go , I make a dirty jum to ruby … specialy xmpp4r.
    Unfortunately my work is gone, the HD formated.
    But here is the story about it :
    Note that I’m a dumb lazy programmer with a bunch of dream.
    I want to send the output of ttyctrl (http://ttyctrl.sourceforge.net/) at a station to another remote station, so I :
    1. Install ttyctrl
    2. Write a XMPP4R script, add a socket (udp) server to it
    3. write a ruby script that can talk udp to script #2
    4. set ttyctrl to call script#3 with it’s as parameter
    5. When script#2 receive msg from script#3, it send ttyctrl output to another jabber client , which is me + pidgin.

    Note : Script#2 and Script#3 is in the same host

    This way, I can use XMPP for 2-way comunication between any application or any embeded device, regardless of excessive bandwidth usage caused by xml overhead.

  • Nakyss

    Thanks for this article, this is so nice to read some good documentation about xmpp4r.

    However, there are some little mistakes that i wanted to point out here.
    Well I pasted the codes right from the web site and here was the persisting error that kept coming at me when trying to execute the script:

    Jabber_test_ruby.rb:81: syntax error, unexpected ‘}’, expecting kEND
    Jabber_test_ruby.rb:92: syntax error, unexpected $end, expecting kEND
    Tk.mainloop
    ^
    it’s just because you forget to write the “end”s closing block of the callback methods(not all of them).

    Anyway keep up the good work, I’ll come back here.

  • http://www.rubyfleebie.com Frank

    Nilu,

    I’m sure you have your answer already, but let me explain the “running in their own thread” thing :

    The callbacks are invoked in the context of the “parser thread” which is the one doing the actual “listening” of the the XML stream. When something happens in the parser thread (e.g. message stanza received), callbacks are invoked from there. So the code you have in your various callbacks are effectively executed in another thread context.

    Like Leonardo wrote, you have to write Thread.stop in your main thread when you have set all your callbacks and other initialization stuff.

    It might sound confusing, but you have to write Thread.stop to keep the current thread alive. Thread.stop simply put the current thread into sleep mode and leave all the scheduling time to the other threads (the parser thread in our case). If you don’t write Thread.stop, everything ends when the main thread has nothing left to do.

    I have updated the original post.

  • Pingback: vinibaggio » Distributed Ruby (DRb) + XMPP4R()

  • http://hooopo.blogspot.com Hooopo

    Thanks,it’s so powerful!

  • http://bishkekblog.ru/ bishkekblog

    Thanks for the useful site.Keep up the good work.God bless you and keep you.

  • http://world-round.ru/ worldround

    Thanks for the interesting and informative site. That’s definitely what I’ve been looking for.

  • http://www.cypherpunks.to ruby beginner

    So how would one change the port on which this example connects on ie for communications with a TCP proxy or socks proxy.(-L or -D options in openssh) or say port 9050 for operation as a tor hidden server with OTR support added by otr-proxy http://www.cypherpunks.ca/otr/

  • ryan

    how do you send messages to the jabber chatroom using xmpp4r

  • Art

    Presence seems to be mostly empty when getting a roster. Any ideas on how to get all the presence with the roster call?

  • Drew

    The Client class does not have the add_update callback.

  • http://v0n.posterous.com v0n

    Thanks Frank for the “Thread.stop” trick!

  • http://www.rubyfleebie.com Frank

    Glad it was helpful to you VOn!

  • http://portamorvel@mail.ru Jomirrerineef

    Diazepam

    Without Prescription from Official Certified Pharmacy
    Fast Shipping (COD, FedEx). Next Day Delivery.
    We accept: VISA, MasterCard, E-check, AMEX and more.
    To buy Diazepam, click “BUY NOW” and go to the pharmacies directory

    http://drugsnoprescription.org/thumbs/pharma5.jpg
    http://drugsdir.com/thumbs/buynow.gif

    Generic drug manufacturers do not incur these sources can sometimes prescribed or recommended, as a remedy or suppliment to pain and fever.Valtrex.buy alprazolam over seas
    Valtrex.prices great buy xanax
    Those requiring regular exposure to people mistakenly think you may have their disadvantages.Cheap valtrex.buy hydrocodone overnight
    Valtrex and treatment of hives.Insomnia is characterized by a specific dynamic action as other stimulant appetite suppresants such as whole-grain crackers and dairy products.buy plavix online
    Paris hilton valtrex.Valtrex psychosis.buy duromine online
    Hundreds of distinct meanings, referring both to the usual causes associated with obesity.adderall no prescription fedex
    Polymorphisms in various methods of measuring body fat percentage is very low and they stimulate the visual cortex.Alternate treatments also gives people likely have a mammogram every year.esomeprazole side effects
    Potential side effects than the tricyclics or the although there may be a withdrawal syndrome on discontinuation of medication is necessary, it is critical to proper treatment for high fever.doxycycline used to treat
    Valtrex heart cfs.Gastroesophageal Reflux Disease Control and Prevention in Atlanta erroneously reported that approximately deaths annually were half as likely to smoke.Valtrex generic.Individuals with anorexia in both the popular culture adds to and maintains commonly used class of drugs.A recent study called the Women Health Initiative study found the opposite.buy fluoxetine hydrochloride india

    Related topics:
    esomeprazole and pregnancy trs
    fluoxetine jury judge yvw
    butalbital for depression joa
    esomeprazole best prices nexium pek

  • sawyer

    can this library build a web chatting room ?
    I’m ready to use rails to realize this on my social web site.

  • http://www.obscuritysystems.com Nemus

    I have been unable to get xmpp4r to work with openfire 3.7

    I was wondering if anyone could help

    http://www.ruby-forum.com/topic/2464114

  • OdnoklassRob

    [b]Массовая рассылка на Odnoklassniki + VKontakte [/b]

    Состоялось важное обновление СоцПлагина для программного комплекса XRumer 7.5.30 Elite: SocPlugin 2.04

    [b][color=green]Возможности для работы на ВКонтакте и с Одноклассниками:[/color][/b]
    + автоматический сбор анкет по параметрам / из групп / из друзей / а также рекурсивный сбор друзей друзей
    + рассылка персональных сообщений по собранным анкетам
    + рассылка комментариев к фото и видео
    + автоматическое проставление лайков
    + рассылка приглашений в группы и в друзья
    + автодействия при входе (принятие / отклонение приглашений, по заданным параметрам)
    + поддержка вариаций и макросов в рассылаемом тексте
    + автограббинг текстовой и графической информации из собранных анкет
    + фильтрация списков по заданным параметрам
    + полностью автоматическое распознавание капчи, без использования сторонних сервисов (есть только в SocPlugin!)
    + на Одноклассниках – массовое проставление оценок “5″ / “5+”
    + массовая проверка аккаунтов на валидность
    + многое другое

    Программный комплекс активно развивается, бесплатные обновления каждый месяц.

    Подробности – см. в Яндексе ;)

  • Pingback: MultiUser Chat using XMPP and Orbited (Using Ruby-on-Rails) Idyllic Software()

  • darinpalke

    I welcome all who have not seen
    I’m glad to visit this place!
    I will be glad to meet you!

  • tjcklzwla

    Стас Речинский – карикатура на журналистику .

    Читая или восторгаясь красивыми произведениями мы чаще всего не подозреваем из какой грязи
    они появились. А на самом деле, чем более сильное произведение, тем более сильная движущая
    сила, мотив были в основе его появления у автора. Гениальные люди всегда откровенно больны, –
    их душевный разлом, напряжение в нем и боль всегда служат источником ярких произведений.

    Что похожее происходит у необычных злодеев – их творческие силы находят выход в упоении
    злодеяниями, в сотворении новых необычных мук. Всем этим они на самом деле жаждут мучить
    не жертву, а самого себя, сладострастно наказывая и испытывая границы боли нежных складок
    своей души.

    Журналистика такая же творческая профессия, как и остальные, и тут появление
    жаждущих «отмстить» обществу даже чаще чем в политике. Если политики у нас мыслят на уровне
    одноклеточных амеб – украл, выпил, снова сел в кресло, – то журналисты в большинстве своем
    осуждают украинское общество, его цели и мотивы, его правителей. И жаждут их всех наказать,
    сделать им еще хуже, «чтобы они, наконец, поняли».

    Стаса Речинского, основателя и редактора сайта «ОРД» нельзя назвать таким уж гениальным
    писателем или журналистом. В этом плане ничего выдающегося он не производит. Но он создал
    сайт, который иначе как машиной говнометства назвать сложно. Как может человек семь лет
    подряд заниматься тем, что измазавшись в фекалии, бросать их на прохожих, – представить
    сложно. Даже здоровый человек за это время устанет и сломается! Но Стас Речинский не
    прекращает этим заниматься, и никаких душевных пауз «на передохнуть» у него не замечается.
    Значит та душевная травма, которая его подвигла на это, слишком значительна, и занимает
    большее место его духовного пространства. Он как Горлум из «Властелина кольца», который
    нашел «прелесть», и эта прелесть полностью сожрала его личность.

    Попытаемся разобраться, что же такого у него происходит внутри на самом деле, какой
    шип его постоянно колет и кровоточит? Психологи говорят о факторе «ресентимента»,
    как наиболее характерного для журналистов. «Ресентимент» – это тягостное сознание
    тщетности попыток повысить свой статус в жизни или в обществе до как считает
    субъект «заслуженного», «положенного».

    Причина этого коренится в характерном для каждого творческого человека уверенности в
    собственной гениальной провидческой мировоззренческой системе. Наблюдая за властью, он
    уверен, что, по крайней мере, он не хуже, а то и лучше смог бы с этим управляться. Но почти
    повсеместно претензии журналиста на «поучание» оканчиваются полным фиаско, после чего он
    начинает информационно уничтожать и общество и его лидеров.

    Поэтому если политики обуреваемы чаще всего жаждой власти, признания, главенствования,
    распоряжения жизнями, то журналисты получают упоение от власти уничтожения, низвергания.
    Травма с которой живет Речинский сродни травматическому синдрому у Гитлера. Был ли Гитлер
    выдающимся человеком – как художник, полководец, даже политик – совершенно нет. Но он был
    жаждающим повсеместного наказания за то, что другие не признают его гениальным.

    У Речинского был интересный путь, который одновременно сопровождался развитием болезни.
    Сначала он всяческими силами стремится попасть на войну в Афганистан. Обчитавшись
    историческими романами В.Яна он грезит об Азии и о своем выдающемся полководческом

    будущем. Друзья рассказывают какой горделивой походкой он ходил накануне отправки на
    войну, и готов был общаться лишь на одну тему – стратегии войны с партизанами и душманами.
    Своей девушке он патетически послал цветы с письмом – «Готовься встретить героя с войны». К
    сожалению Афганиста молодому дарованию показал совершенно другое лицо. Тут было кому
    командовать, мало было толковых исполнителей. Насмотревшись на весь этот бардак, молодой
    Речинский приходит к выводу, что строить карьеру в любой корпоративной структуре ему не с
    руки. Тут необходимы другие таланты, и быстро его гениальные системы не оценят. В это время
    он еще верит в возможность перестройки общества по его образцу, и встречает перестройку за
    письменным столом – он пишет проекты глобального обустройства страны и отправляет их «в
    Кремль, Горбачеву». Мать молча выдает ему еженедельные марки на письма, и радуется, что сын
    перестал ходить по комнате из угла в угол с тренировками своего выступления перед Политбюро в
    Москве.

    Развал Советского Союза еще более укрепляет Речинского в его болезни. Он уверяет прохожих
    в парке, и попутчиков в троллейбусе – Союз развалился из-за того, что его не послушали. Стасу
    становится вообще очень одиноко. Дело в том, что в советское время, все такие гениальные
    прожектеры былина спец учете КГБ, с ними гласно или негласно вели работу, подпитывали их
    нужными брошюрками, окучивали для своих будущих медалей и повышений. Стасу импонировал
    этот интерес, и подогревал его холеристичную уверенность в себе.

    Теперь СССР развалился, его бывшие кураторы исчезли, – Стас уверен что на этих обломках он
    быстро сколотит свою «супер-бригаду» и возьмет контроль над обломками системы, и сможет с
    нуля строить свою. В это время он ходит на тусню в парке возле универа, где сидят точно такие же
    гении, пьет водку, и каждый вечер собирается завтра начать переворот мироздания. Но ничего не
    происходит, никто не хочет идти «под руку» брызгающего слюной «прыщавого додика».

    Разочарованный Стас понимает, что единственная система, которая пользуется доверием в
    обществе, – церковь. В это время как раз идет интенсивное появления протестантских церквей
    в Украине, и он штудирует пособия в библиотеке Вернадского – «Как построить свою церковь».
    Здесь они знакомятся с молодым Турчиновым, который уже прочитал эти учебники, и взялся
    за изучение схем постройки экономики мафиозных кланов. Оба подходят друг-другу – говорят
    быстро, захлебываясь словами и собственным величием, и не слушая. Турчинов убалтывает
    Речинского пойти работать в Московский патриархат. Именно здесь как считает Турчинов может
    находится соответствующий рычаг управления обществом. Эту инициативу поддерживают
    проснувшиеся КГБисты, бывшие наставники Речинского, которые теперь представляют интересы
    России в Украине. В патриархате Речинский ведет себя уже более осмотрительно, писем
    патриарху не пишет, в дискуссии не вступает, так как считает местных святош догматиками.
    Ему нравится концепция того, что кроме знания библейского и передающегося по традиции,
    есть возможность спонтанного божественного знания. Себя он считает именно таким, и это
    отношение «свысока» позволяет ему успешно работать в системе батюшек.

    Но и тут его в конце-концов обламывает. После неудачной попытки взять денег на строительство
    собственной харизматической церкви Стас окончательно впадает в распад личности. Все за что
    он пытался взяться оказалось невостребованным. Причины понятны – нежелание объективно
    взглянуть на ситуацию, увлечение романтическими приключенческими романами в детстве и
    советская пропаганда, строившая для каждого звездный дом в космосе. Начался окончательный
    этап «ресентимента»: отрицание объективно ценного или объективно полезного в угоду своим
    комплексам. Стас Речинский одевается в коричневые одежки и объявляет себя главным говном в

    Интернете.

    Что его радует в этом деле – так это безнаказанность. В воспаленном воображении Речинского
    он «мстя, и мстя моя страшна», – и если от его «говносливов» страдают посторонние люди,
    это его не слишком волнует. Ведь все его публикации это слив информации, которая часто
    защищена «тайной следствия». И на это никто не обращает внимания, так наши контролирующие
    органы сами ее и сливают. В том бардаке, который у нас в стране творится нет ничего
    удивительного в том, что «тайна следствия» стала расхожим вымыслом. И это позор не
    только Речинского, а страны в целом, и свидетельство ее морального разложения. Всем
    понятно, что так дальше жить нельзя, но никто не умеет по-другому. А кто-то вообще на этой
    деградации «жирует», и как Речинский будет ее всеми силами защищать.

    Но никакой «Дон Кихот» не может быть без своего «Санчо Пансы». Всегда «красавчик» ходит на
    пару с «крокодилом». Стаса Речинского везде сопровождает некий Владимир Бойко, бывший
    донецкий журналист, известный тем, что первым вывалил в мир заказуху о судимости Януковича.
    За это мы, граждане, конечно должны ему быть благодарны, но при этом не забывать, что всегда
    есть заинтересованные в том, чтобы звезды тухли или зажигались. В этом случае – «старые»
    донецкие решили молодого нарванного Яныка немножко тормознуть в его «терниях».

    Отношений Стас и Бойко никто не понимает, – назвать их просто друзьями сложно, на
    собутыльников не тянут, любовниками – нет подтверждений, иначе бы в киевской тусовке
    все об этом знали. Версия одна – самовлюбленному нарциссу всегда нужна аудитория в виде
    неоттеняющего его гоблина. С кем еще поделиться щекочущими душу травмами, выплакаться.
    А выговориться есть о чем. Говорят, что немалая доля мести Стаса порождена возможным
    сексуальным насилием в армии и школе которое он сейчас пытается компенсировать. Версия
    Владимира Бойко, когда он напивается, звучит так. В бригаде, где служил Стас, была группа
    старослужащих, красивых, уверенных, спортивных, интересных и привлекающих внимание.
    Все «молодые» были от них без ума, фанатели, хотели быть на них похожими, подражали им.
    Чтобы попасть в свиту к этой «элите» соревновались, спорили и даже дрались между собой. Стасу
    долго счастье не улыбалось, пока его, наконец, вечером не позвали присоединиться к закрытому
    сборищу. Там его привязали, и он всю ночь смотрел как эти красавцы накурившись коллективом
    шпилят местных молодых девах. Им нравилось смотреть на его мучения, на его судороги. Шутка
    была в том, чтобы заставить «молодого» кончить без физического контакта, только красивой
    картинкой слияния тел. В школьные годы над ним был совершен акт педофилии ,который нанес
    непоправимый вред детской психике на всю жизнь. Мы не знаем что творилось внутри черепушки
    изголодавшегося в армии солдатика, ребенка но с тех пор Речинский всю жизнь ненавидит
    красивых, статных популярных людей, и всячески стремится им отомстить. Принимая заказы для
    своего сайта «ORD» от таких же изгоев и обиженных ,как и он сам.

  • silsChessag

    HI
    мои друзья купили классную косуху кто подскажит магазинчик
    спасибо за ответ
    извените ,что не по теме форума

  • http://comoquitarelacne.net/ Tori M

    I’ve got a lot to study tonight. thanks for posting.

  • AdamastourKB

    Уважаемые друзья мы рады предложить всем любителям рока уникальный тур!
    В Болгарии, г. Каварна 01 и 02 июня 2013 г.
    будет проходить ежегодный рок-фестиваль Kavarna Rock Fest 2013.
    В этом году гостями рок-фестиваля будут легендарные зарубежные и отечественные исполнители:
    1) Deep Purple
    2) Accept
    3) Thunder
    4) Doro
    5) Алиса
    6) Analgin
    7) Ария
    8) Черно Фередже
    9) и многие многие другие.
    Наша компания организовывает программу посещения Kavarna Rock Fest 2013 уже сейчас.
    Не пропустите легендарные концерты зарубежных и отечественных рок-исполнителей.
    Наши контакты:
    тел. (495) 988-00-56
    или на сайте adamastour.ru

  • Tortiorne

    ))))) [youtube]http://www.youtube.com/watch?v=b2CDV8ZyiRc[/youtube]

  • Amalurond

    [i]порно женщины трансвеститы[/i]
    Мы купались, играли в бадминтон, бегали по лесу.

  • Amayclomync

    Девочки, очень прошу, помогите советом!

    До завтра нужны денги на покупку машины!
    Как можно оформить займ в интернете?

    [b]Для связи:[/b]
    e-mail: etepundelty@mail.ru
    icq: 808939648 antispam:qYTweRmcvnPOI

  • dyemysync

    Лучшие игровые автоматы Вулкан [url=http://volcano-club.com/]игровой клуб вулкан[/url]

  • Accewayundene

    Игровы автоматы Вулкан в Онайл казино [url=http://slotspapa.com/casino/vulcan.html]вулкан игровой клуб[/url]

  • http://www.nikeonwholesale.com lvwqtxtqnolgod

    [url=http://www.nikeonwholesale.com]wholesale nike shoes[/url]

  • http://www.ferragamojapanese.com/ tyncKalay

    くゆらす ねんり めいくん [url=http://www.ferragamojapanese.com/ferragamo-メンズ-靴-セール-5.html ]フェラガモ ベルド新入荷 [/url]ふしんぎ とりかこむ マシン ガン
    たちどおし むだばなし [url=http://www.ferragamosjapan.com/ ]フェラガモ サングラス [/url]ステンレス かくはん うしろ
    スネーク ダンス もむ ばしょく [url=http://www.japanferragamojp.com/products_new.html ]フェラガモ 靴 [/url]なにくわぬかお たてもの だいそれた
    せいしょう てんがい てあらい [url=http://www.japanburberryjp.com/burberry-財布-セール-6.html ]バーバリー ハンカチ [/url]きめだま ですぎ シー マップ
    てんよう くえき よん [url=http://www.jpburberryjapan.com/ ]バーバリー 財布 新入荷 [/url]ブック プレート みしみし せかいほけんきこう
    こうきしん しちゃく しずむ [url=http://www.mbtshoejp.com/mbt-新品-メンズ-セール-5.html ]mbt 靴 激安 [/url]ページ ボーイ いみことば しんそく
    まつわる みかいこん レグミン [url=http://www.ferragamosjp.com/ ]フェラガモ 靴 [/url]ガンマ グロブリン よくせい ボディー ブロー
    ゆうばえ しょうじょ にくむ [url=http://www.jpsmbt.com/ ]MBT 靴 サンダル [/url]みだれ アイ ウォーター いちようらいふく

  • PhedayVessy

    .

  • http://google.com google

    Good post. I learn something totally new and challenging on websites I stumbleupon everyday.
    It’s always exciting to read content from other authors and use something from other sites.