code:
# Translation of StatusNet - Adsense to Brazilian Portuguese (português do Brasil)
# Exported from translatewiki.net
#
# Author: Giro720
# Author: Luckas Blade
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Adsense\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:07:33+0000\n"
"Language-Team: Brazilian Portuguese <https://translatewiki.net/wiki/Portal:"
"pt-br>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 10:22:41+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: pt-br\n"
"X-Message-Group: #out-statusnet-plugin-adsense\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#. TRANS: Menu item title/tooltip
msgid "AdSense configuration"
msgstr "Configuração do AdSense"

#. TRANS: Menu item for site administration
#, fuzzy
msgctxt "MENU"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Plugin description.
msgid "Plugin to add Google AdSense to StatusNet sites."
msgstr "Plugin para adicionar Google AdSense aos sites StatusNet."

#. TRANS: Title of AdSense administrator panel.
msgctxt "TITLE"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Instructions for AdSense administrator panel.
msgid "AdSense settings for this StatusNet site"
msgstr "Configurações do AdSense para este site StatusNet"

#. TRANS: Field label in AdSense administration panel.
msgid "Client ID"
msgstr "Identificação do cliente"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Google client ID."
msgstr "ID de cliente Google"

#. TRANS: Field label in AdSense administration panel.
msgid "Ad script URL"
msgstr "URL do script do anúncio"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Script URL (advanced)."
msgstr "URL do script (avançado)"

#. TRANS: Field label in AdSense administration panel.
msgid "Medium rectangle"
msgstr "Retângulo médio"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Medium rectangle slot code."
msgstr "Código colocado dentro de um retângulo médio."

#. TRANS: Field label in AdSense administration panel.
msgid "Rectangle"
msgstr "Retângulo"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Rectangle slot code."
msgstr "Código colocado dentro de um retângulo."

#. TRANS: Field label in AdSense administration panel.
msgid "Leaderboard"
msgstr "Classificação"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Leaderboard slot code."
msgstr "Classificação"

#. TRANS: Field label in AdSense administration panel.
msgid "Skyscraper"
msgstr ""

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Wide skyscraper slot code."
msgstr "Código colocado dentro de um retângulo."

#. TRANS: Button text to save settings in AdSense administration panel.
#, fuzzy
msgctxt "BUTTON"
msgid "Save"
msgstr "Salvar"

#. TRANS: Button title to save settings in AdSense administration panel.
#, fuzzy
msgid "Save AdSense settings."
msgstr "Salvar as configurações do AdSense"


code:
# Translation of StatusNet - Adsense to Russian (русский)
# Exported from translatewiki.net
#
# Author: Eleferen
# Author: Lockal
# Author: Сrower
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Adsense\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:07:33+0000\n"
"Language-Team: Russian <https://translatewiki.net/wiki/Portal:ru>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 10:22:41+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: ru\n"
"X-Message-Group: #out-statusnet-plugin-adsense\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"

#. TRANS: Menu item title/tooltip
msgid "AdSense configuration"
msgstr "Конфигурация AdSense"

#. TRANS: Menu item for site administration
msgctxt "MENU"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Plugin description.
msgid "Plugin to add Google AdSense to StatusNet sites."
msgstr "Плагин для добавления Google AdSense на сайты StatusNet."

#. TRANS: Title of AdSense administrator panel.
msgctxt "TITLE"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Instructions for AdSense administrator panel.
msgid "AdSense settings for this StatusNet site"
msgstr "Настройки AdSense для этого сайта StatusNet"

#. TRANS: Field label in AdSense administration panel.
msgid "Client ID"
msgstr "ID клиента"

#. TRANS: Field title in AdSense administration panel.
msgid "Google client ID."
msgstr "Идентификатор клиента Google."

#. TRANS: Field label in AdSense administration panel.
msgid "Ad script URL"
msgstr "URL-адрес скрипта рекламы"

#. TRANS: Field title in AdSense administration panel.
msgid "Script URL (advanced)."
msgstr "URL-адрес скрипта (расширенная настройка)."

#. TRANS: Field label in AdSense administration panel.
msgid "Medium rectangle"
msgstr "Средний прямоугольник"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Medium rectangle slot code."
msgstr "Слот-код среднего прямоугольника"

#. TRANS: Field label in AdSense administration panel.
msgid "Rectangle"
msgstr "Прямоугольник"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Rectangle slot code."
msgstr "Слот-код прямоугольника"

#. TRANS: Field label in AdSense administration panel.
msgid "Leaderboard"
msgstr "Доска лидеров"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Leaderboard slot code."
msgstr "Слот-код доски лидеров"

#. TRANS: Field label in AdSense administration panel.
msgid "Skyscraper"
msgstr "Небоскреб"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Wide skyscraper slot code."
msgstr "Слот-код широкого небоскреба"

#. TRANS: Button text to save settings in AdSense administration panel.
msgctxt "BUTTON"
msgid "Save"
msgstr "Сохранить"

#. TRANS: Button title to save settings in AdSense administration panel.
msgid "Save AdSense settings."
msgstr "Сохранить настройки AdSense."

license: mit


code:
# Translation of StatusNet - Adsense to Swedish (svenska)
# Exported from translatewiki.net
#
# Author: Jamminjohn
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Adsense\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:07:33+0000\n"
"Language-Team: Swedish <https://translatewiki.net/wiki/Portal:sv>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 10:22:41+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: sv\n"
"X-Message-Group: #out-statusnet-plugin-adsense\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Menu item title/tooltip
msgid "AdSense configuration"
msgstr "Konfiguration av AdSense"

#. TRANS: Menu item for site administration
msgctxt "MENU"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Plugin description.
msgid "Plugin to add Google AdSense to StatusNet sites."
msgstr ""
"Insticksmodul för att lägga till Google AdSense på StatusNet-webbplatser."

#. TRANS: Title of AdSense administrator panel.
msgctxt "TITLE"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Instructions for AdSense administrator panel.
msgid "AdSense settings for this StatusNet site"
msgstr "AdSense-inställningar för denna StatusNet-webbplats"

#. TRANS: Field label in AdSense administration panel.
msgid "Client ID"
msgstr "Klient-ID"

#. TRANS: Field title in AdSense administration panel.
msgid "Google client ID."
msgstr "Google klient-ID."

#. TRANS: Field label in AdSense administration panel.
msgid "Ad script URL"
msgstr "Skript-URL för annons"

#. TRANS: Field title in AdSense administration panel.
msgid "Script URL (advanced)."
msgstr "Skript-URL (avancerat)."

#. TRANS: Field label in AdSense administration panel.
msgid "Medium rectangle"
msgstr "Medium rektangel"

#. TRANS: Field title in AdSense administration panel.
msgid "Medium rectangle slot code."
msgstr "Platskod för mellanstor rektangel."

#. TRANS: Field label in AdSense administration panel.
msgid "Rectangle"
msgstr "Rektangel"

#. TRANS: Field title in AdSense administration panel.
msgid "Rectangle slot code."
msgstr "Platskod för rektangel."

#. TRANS: Field label in AdSense administration panel.
msgid "Leaderboard"
msgstr "Leaderboard"

#. TRANS: Field title in AdSense administration panel.
msgid "Leaderboard slot code."
msgstr "Platskod för leaderboard."

#. TRANS: Field label in AdSense administration panel.
msgid "Skyscraper"
msgstr "Skyskrapa"

#. TRANS: Field title in AdSense administration panel.
msgid "Wide skyscraper slot code."
msgstr "Platskod för bred skyskrapa."

#. TRANS: Button text to save settings in AdSense administration panel.
msgctxt "BUTTON"
msgid "Save"
msgstr "Spara"

#. TRANS: Button title to save settings in AdSense administration panel.
msgid "Save AdSense settings."
msgstr "Spara inställningar för AdSense."


code:
# Translation of StatusNet - Adsense to Tagalog (Tagalog)
# Exported from translatewiki.net
#
# Author: AnakngAraw
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Adsense\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:07:33+0000\n"
"Language-Team: Tagalog <https://translatewiki.net/wiki/Portal:tl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 10:22:41+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: tl\n"
"X-Message-Group: #out-statusnet-plugin-adsense\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Menu item title/tooltip
msgid "AdSense configuration"
msgstr "Pagkakaayos ng AdSense"

#. TRANS: Menu item for site administration
msgctxt "MENU"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Plugin description.
msgid "Plugin to add Google AdSense to StatusNet sites."
msgstr ""
"Pampasak upang maidagdag ang AdSense ng Google sa mga sityo ng StatusNet."

#. TRANS: Title of AdSense administrator panel.
msgctxt "TITLE"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Instructions for AdSense administrator panel.
msgid "AdSense settings for this StatusNet site"
msgstr "Mga katakdaan ng Adsense para sa sityong ito ng StatusNet"

#. TRANS: Field label in AdSense administration panel.
msgid "Client ID"
msgstr "ID ng kliyente"

#. TRANS: Field title in AdSense administration panel.
msgid "Google client ID."
msgstr "ID ng kliyente ng Google."

#. TRANS: Field label in AdSense administration panel.
msgid "Ad script URL"
msgstr "URL ng panitik ng anunsyo"

#. TRANS: Field title in AdSense administration panel.
msgid "Script URL (advanced)."
msgstr "URL ng panitik (mas masulong)."

#. TRANS: Field label in AdSense administration panel.
msgid "Medium rectangle"
msgstr "Hindi kalakihang parihaba"

#. TRANS: Field title in AdSense administration panel.
msgid "Medium rectangle slot code."
msgstr "Kodigo ng puwang na hindi kalakihang parihaba."

#. TRANS: Field label in AdSense administration panel.
msgid "Rectangle"
msgstr "Parihaba"

#. TRANS: Field title in AdSense administration panel.
msgid "Rectangle slot code."
msgstr "Kodigo ng puwang na parihaba."

#. TRANS: Field label in AdSense administration panel.
msgid "Leaderboard"
msgstr "Pangunahing-pisara"

#. TRANS: Field title in AdSense administration panel.
msgid "Leaderboard slot code."
msgstr "Kodigo ng puwang ng pangunahing-pisara."

#. TRANS: Field label in AdSense administration panel.
msgid "Skyscraper"
msgstr "Tukud-langit"

#. TRANS: Field title in AdSense administration panel.
msgid "Wide skyscraper slot code."
msgstr "Kodigo ng puwang ng maluwang na tukud-langit."

#. TRANS: Button text to save settings in AdSense administration panel.
msgctxt "BUTTON"
msgid "Save"
msgstr "Sagipin"

#. TRANS: Button title to save settings in AdSense administration panel.
msgid "Save AdSense settings."
msgstr "Sagipin ang mga katakdaan ng AdSense."


code:
# Translation of StatusNet - Adsense to Turkish (Türkçe)
# Expored from translatewiki.net
#
# Author: Maidis
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Adsense\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-12-16 15:08+0000\n"
"PO-Revision-Date: 2010-12-16 15:11:27+0000\n"
"Language-Team: Turkish <http://translatewiki.net/wiki/Portal:tr>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2010-11-30 20:40:24+0000\n"
"X-Generator: MediaWiki 1.18alpha (r78478); Translate extension (2010-09-17)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: tr\n"
"X-Message-Group: #out-statusnet-plugin-adsense\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#. TRANS: Menu item title/tooltip
#: AdsensePlugin.php:194
msgid "AdSense configuration"
msgstr ""

#. TRANS: Menu item for site administration
#: AdsensePlugin.php:196
msgid "AdSense"
msgstr "AdSense"

#: AdsensePlugin.php:209
msgid "Plugin to add Google AdSense to StatusNet sites."
msgstr ""

#: adsenseadminpanel.php:52
msgctxt "TITLE"
msgid "AdSense"
msgstr "AdSense"

#: adsenseadminpanel.php:62
msgid "AdSense settings for this StatusNet site"
msgstr ""

#: adsenseadminpanel.php:164
msgid "Client ID"
msgstr ""

#: adsenseadminpanel.php:165
msgid "Google client ID"
msgstr ""

#: adsenseadminpanel.php:170
msgid "Ad script URL"
msgstr ""

#: adsenseadminpanel.php:171
msgid "Script URL (advanced)"
msgstr ""

#: adsenseadminpanel.php:176
msgid "Medium rectangle"
msgstr ""

#: adsenseadminpanel.php:177
msgid "Medium rectangle slot code"
msgstr ""

#: adsenseadminpanel.php:182
msgid "Rectangle"
msgstr ""

#: adsenseadminpanel.php:183
msgid "Rectangle slot code"
msgstr ""

#: adsenseadminpanel.php:188
msgid "Leaderboard"
msgstr ""

#: adsenseadminpanel.php:189
msgid "Leaderboard slot code"
msgstr ""

#: adsenseadminpanel.php:194
msgid "Skyscraper"
msgstr ""

#: adsenseadminpanel.php:195
msgid "Wide skyscraper slot code"
msgstr ""

#: adsenseadminpanel.php:208
msgid "Save"
msgstr "Kaydet"

#: adsenseadminpanel.php:208
msgid "Save AdSense settings"
msgstr "AdSense ayarlarını kaydet"


code:
# Translation of StatusNet - Adsense to Ukrainian (українська)
# Exported from translatewiki.net
#
# Author: Boogie
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Adsense\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:07:33+0000\n"
"Language-Team: Ukrainian <https://translatewiki.net/wiki/Portal:uk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 10:22:41+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: uk\n"
"X-Message-Group: #out-statusnet-plugin-adsense\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"

#. TRANS: Menu item title/tooltip
msgid "AdSense configuration"
msgstr "Конфігурація AdSense"

#. TRANS: Menu item for site administration
msgctxt "MENU"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Plugin description.
msgid "Plugin to add Google AdSense to StatusNet sites."
msgstr "Додаток для відображення Google AdSense на сторінці сайту StatusNet."

#. TRANS: Title of AdSense administrator panel.
msgctxt "TITLE"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Instructions for AdSense administrator panel.
msgid "AdSense settings for this StatusNet site"
msgstr "Налаштування AdSense на даному сайті StatusNet"

#. TRANS: Field label in AdSense administration panel.
msgid "Client ID"
msgstr "ІД клієнта"

#. TRANS: Field title in AdSense administration panel.
msgid "Google client ID."
msgstr "Ідентифікатор клієнта Google."

#. TRANS: Field label in AdSense administration panel.
msgid "Ad script URL"
msgstr "Адреса скрипту AdSense"

#. TRANS: Field title in AdSense administration panel.
msgid "Script URL (advanced)."
msgstr "URL-адреса сценарію (розширена опція)."

#. TRANS: Field label in AdSense administration panel.
msgid "Medium rectangle"
msgstr "Середній прямокутник"

#. TRANS: Field title in AdSense administration panel.
msgid "Medium rectangle slot code."
msgstr "Слот-код середнього прямокутника."

#. TRANS: Field label in AdSense administration panel.
msgid "Rectangle"
msgstr "Прямокутник"

#. TRANS: Field title in AdSense administration panel.
msgid "Rectangle slot code."
msgstr "Слот-код прямокутника."

#. TRANS: Field label in AdSense administration panel.
msgid "Leaderboard"
msgstr "Банер"

#. TRANS: Field title in AdSense administration panel.
msgid "Leaderboard slot code."
msgstr "Слот-код банеру."

#. TRANS: Field label in AdSense administration panel.
msgid "Skyscraper"
msgstr "Хмарочос"

#. TRANS: Field title in AdSense administration panel.
msgid "Wide skyscraper slot code."
msgstr "Слот-код хмарочосу."

#. TRANS: Button text to save settings in AdSense administration panel.
msgctxt "BUTTON"
msgid "Save"
msgstr "Зберегти"

#. TRANS: Button title to save settings in AdSense administration panel.
msgid "Save AdSense settings."
msgstr "Зберегти налаштування AdSense."


code:
# Translation of StatusNet - Adsense to Simplified Chinese (中文（简体）)
# Exported from translatewiki.net
#
# Author: Chenxiaoqino
# Author: ZhengYiFeng
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Adsense\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:07:33+0000\n"
"Language-Team: Simplified Chinese <https://translatewiki.net/wiki/Portal:zh-"
"hans>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 10:22:41+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: zh-hans\n"
"X-Message-Group: #out-statusnet-plugin-adsense\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#. TRANS: Menu item title/tooltip
msgid "AdSense configuration"
msgstr "AdSense配置"

#. TRANS: Menu item for site administration
#, fuzzy
msgctxt "MENU"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Plugin description.
msgid "Plugin to add Google AdSense to StatusNet sites."
msgstr "添加 Google AdSense 到 StatusNet 网站的插件。"

#. TRANS: Title of AdSense administrator panel.
msgctxt "TITLE"
msgid "AdSense"
msgstr "AdSense"

#. TRANS: Instructions for AdSense administrator panel.
msgid "AdSense settings for this StatusNet site"
msgstr "这个 StatusNet 网站的 AdSense 设置"

#. TRANS: Field label in AdSense administration panel.
msgid "Client ID"
msgstr "客户ID"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Google client ID."
msgstr "Google 发布商 ID（例如：pub-1234567890123456）"

#. TRANS: Field label in AdSense administration panel.
msgid "Ad script URL"
msgstr "广告脚本地址"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Script URL (advanced)."
msgstr "高级脚本地址"

#. TRANS: Field label in AdSense administration panel.
msgid "Medium rectangle"
msgstr "中等矩形"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Medium rectangle slot code."
msgstr "中等矩形广告代码（#ID）"

#. TRANS: Field label in AdSense administration panel.
msgid "Rectangle"
msgstr "小矩形"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Rectangle slot code."
msgstr "小矩形广告代码（#ID）"

#. TRANS: Field label in AdSense administration panel.
msgid "Leaderboard"
msgstr "首页横幅"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Leaderboard slot code."
msgstr "首页横幅广告代码（#ID）"

#. TRANS: Field label in AdSense administration panel.
msgid "Skyscraper"
msgstr "宽幅摩天大楼"

#. TRANS: Field title in AdSense administration panel.
#, fuzzy
msgid "Wide skyscraper slot code."
msgstr "宽幅摩天大楼广告代码（#ID）"

#. TRANS: Button text to save settings in AdSense administration panel.
#, fuzzy
msgctxt "BUTTON"
msgid "Save"
msgstr "保存"

#. TRANS: Button title to save settings in AdSense administration panel.
#, fuzzy
msgid "Save AdSense settings."
msgstr "保存AdSense设置"


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2009, StatusNet, Inc.
 *
 * Send and receive notices using the AIM network
 *
 * PHP version 5
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  IM
 * @package   StatusNet
 * @author    Craig Andrews <candrews@integralblue.com>
 * @copyright 2009 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    // This check helps protect against security problems;
    // your code file can't be executed directly from the web.
    exit(1);
}
// We bundle the phptoclib library...
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/phptoclib');

/**
 * Plugin for AIM
 *
 * @category  Plugin
 * @package   StatusNet
 * @author    Craig Andrews <candrews@integralblue.com>
 * @copyright 2009 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */
class AimPlugin extends ImPlugin
{
    public $user =  null;
    public $password = null;
    public $publicFeed = array();

    public $transport = 'aim';

    function getDisplayName()
    {
        // TRANS: Display name.
        return _m('AIM');
    }

    function normalize($screenname)
    {
		$screenname = str_replace(" ","", $screenname);
        return strtolower($screenname);
    }

    function daemonScreenname()
    {
        return $this->user;
    }

    function validate($screenname)
    {
        if(preg_match('/^[a-z]\w{2,15}$/i', $screenname)) {
            return true;
        }else{
            return false;
        }
    }

    /**
     * Load related modules when needed
     *
     * @param string $cls Name of the class to be loaded
     *
     * @return boolean hook value; true means continue processing, false means stop.
     */
    function onAutoload($cls)
    {
        $dir = dirname(__FILE__);

        switch ($cls)
        {
        case 'Aim':
            require_once(INSTALLDIR.'/plugins/Aim/extlib/phptoclib/aimclassw.php');
            return false;
        }

        return parent::onAutoload($cls);
    }

    function onStartImDaemonIoManagers(&$classes)
    {
        parent::onStartImDaemonIoManagers($classes);
        $classes[] = new AimManager($this); // handles sending/receiving
        return true;
    }

    function microiduri($screenname)
    {
        return 'aim:' . $screenname;
    }

    function sendMessage($screenname, $body)
    {
        $this->fake_aim->sendIm($screenname, $body);
	    $this->enqueueOutgoingRaw($this->fake_aim->would_be_sent);
        return true;
    }

    /**
     * Accept a queued input message.
     *
     * @return true if processing completed, false if message should be reprocessed
     */
    function receiveRawMessage($message)
    {
        $info=Aim::getMessageInfo($message);
        $from = $info['from'];
        $user = $this->getUser($from);
        $notice_text = $info['message'];

        $this->handleIncoming($from, $notice_text);

        return true;
    }

    function initialize(){
        if(!isset($this->user)){
            // TRANS: Exception thrown in AIM plugin when user has not been specified.
            throw new Exception(_m('Must specify a user.'));
        }
        if(!isset($this->password)){
            // TRANS: Exception thrown in AIM plugin when password has not been specified.
            throw new Exception(_m('Must specify a password.'));
        }

        $this->fake_aim = new Fake_Aim($this->user,$this->password,4);
        return true;
    }

    function onPluginVersion(&$versions)
    {
        $versions[] = array('name' => 'AIM',
                            'version' => GNUSOCIAL_VERSION,
                            'author' => 'Craig Andrews',
                            'homepage' => 'http://status.net/wiki/Plugin:AIM',
                            'rawdescription' =>
                            // TRANS: Plugin description.
                            _m('The AIM plugin allows users to send and receive notices over the AIM network.'));
        return true;
    }
}


code:
The AIM plugin allows users to send and receive notices over the AIM network.

Installation
============
add "addPlugin('aim',
    array('setting'=>'value', 'setting2'=>'value2', ...);"
to the bottom of your config.php

scripts/imdaemon.php included with StatusNet must be running. It will be started by
the plugin along with their other daemons when you run scripts/startdaemons.sh.
See the StatusNet README for more about queuing and daemons.

Settings
========
user*: username (screenname) to use when logging into AIM
password*: password for that user

* required
default values are in (parenthesis)

Example
=======
addPlugin('aim', array(
    'user=>'...',
    'password'=>'...'
));

path: plugins/Aim/README


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * Instead of sending AIM messages, retrieve the raw data that would be sent
 *
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Network
 * @package   StatusNet
 * @author    Craig Andrews <candrews@integralblue.com>
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET') && !defined('LACONICA')) {
    exit(1);
}

class Fake_Aim extends Aim
{
    public $would_be_sent = null;

    function sflapSend($sflap_type, $sflap_data, $no_null, $formatted)
    {
        $this->would_be_sent = array($sflap_type, $sflap_data, $no_null, $formatted);
    }
}


code:
phpTOCLib version 1.0 RC1

This is released under the LGPL. AIM,TOC,OSCAR, and all other related protocols/terms are
copyright AOL/Time Warner. This project is in no way affiliated with them, nor is this
project supported by them.

Some of the code is loosely based off of a script by Jeffrey Grafton. Mainly the decoding of packets, and the
function for roasting passwords is entirly his.

TOC documentation used is available at http://simpleaim.sourceforge.net/docs/TOC.txt

About:
phpTOCLib aims to be a PHP equivalent to the PERL module NET::AIM. Due to some limitations,
this is difficult. Many features have been excluded in the name of simplicity, and leaves
you alot of room to code with externally, providing function access to the variables that
need them.

I have aimed to make this extensible, and easy to use, therefore taking away some built in
functionality that I had originally out in. This project comes after several months of
researching the TOC protocol.

example.php is included with the class. It needs to be executed from the command line
(ie:php -q testscript.php) and you need to call php.exe with the -q
example is provided as a demonstaration only. Though it creats a very simple, functional bot, it lacks any sort of commands, it merely resends the message it recieves in reverse.

Revisions:

-----------------------------------
by Rajiv Makhijani
(02/24/04)
	 - Fixed Bug in Setting Permit/Deny Mode
	 - Fixes so Uninitialized string offset notice doesn't appear
	 - Replaced New Lines Outputed for Each Flap Read with " . " so
	   that you can still tell it is active but it does not take so much space
	 - Removed "eh?" message
	 - Added MySQL Database Connection Message
	 - New Functions:
		update_profile(profile data string, powered by boolean)
			* The profile data string is the text that goes in the profile.
			* The powered by boolean if set to true displays a link to the
			  sourceforge page of the script.
(02/28/04)
	- Silent option added to set object not to output any information
		- To follow silent rule use sEcho function instead of Echo
-----------------------------------
by Jeremy (pickleman78)
(05/26/04) beta 1 release
	-Complete overhaul of class design and message handling
	-Fixed bug involving sign off after long periods of idling
	-Added new function $Aim->registerHandler
	-Added the capability to handle all AIM messages
		-Processing the messages is still the users responsibility
	-Did a little bit of code cleanup
	-Added a few internal functions to make the classes internal life easier
	-Improved AIM server error message processing
	-Updated this document (hopefully Rajiv will clean it up some, since I'm a terrible documenter)
-------------------------------------------------------------------------------------------------------------

Functions:

Several methods are provided in the class that allow for simple access to some of the
common features of AIM. Below are details.

$Aim->Aim($sn,$password,$pdmode, $silent=false)
The constructor, it takes 4 arguments.
$sn is your screen name
$password is you password, in plain text
$pdmode is the permit deny mode. This can be as follows:
1 - Allow All
2 - Deny All
3 - Permit only those on your permit list
4 - Permit all those not on your deny list
$silent if set to true prints out nothing

So, if your screen-name is JohnDoe746 and your password is fertu, and you want to allow
all users of the AIM server to contact you, you would code as follows
$myaim=new Aim("JohnDoe746","fertu",1);

$Aim->add_permit($buddy)
This adds the buddy passed to the function to your permit list.
ie: $myaim->add_permit("My friend22");

$Aim->block_buddy($buddy)
Blocks a user. This will switch your pd mode to 4. After using this, for the user to remain
out of contact with you, it is required to provide the constructor with a pd mode of 4
ie:$myaim->block_buddy("Annoying guy 4");

$Aim->send_im($to,$message,$auto=false)
Sends $message to $user. If you set the 3rd argument to true, then the recipient will receive it in
the same format as an away message. (Auto Response from me:)
A message longer than 65535 will be truncated
ie:$myaim->send_im("myfriend","This is a happy message");

$Aim->set_my_info()
Sends an update buddy command to the server and allows some internal values about yourself
to be set.
ie:$myaim->set_my_info();

$Aim->signon()
Call this to connect to the server. This must be called before any other methods will work
properly
ie:$mybot->signon();

$Aim->getLastReceived()
Returns $this->myLastReceived['decoded']. This should be the only peice of the gotten data
you need to concern yourself with. This is a preferred method of accessing this variable to prevent
accidental modification of $this->myLastReceived. Accidently modifying this variable can
cause some internal failures.

$Aim->read_from_aim()
This is a wrapper for $Aim->sflap_read(), and only returns the $this->myLastReceived['data']
portion of the message. It is preferred that you do not call $Aim->sflap_read() and use this
function instead. This function has a return value. Calling this prevents the need to call
$Aim->getLastReceived()

$Aim->setWarning($wl)
This allows you to update the bots warning level when warned.

$Aim->getBuddies()
Returns the $this->myBuddyList array. Use this instead of modifying the internal variable

$Aim->getPermit()
Returns the $this->myPermitList array. Use this instead of modifying the internal variable

$Aim->getBlocked()
Returns the $this->myBlockedList array. Use this instead of modifying the internal variable

$Aim->warn_user($user,$anon=false)
Warn $user. If anon is set to true, then it warns the user anonomously

$Aim->update_profile($information, $poweredby=false)
Updates Profile to $information.  If $poweredby is true a link to
sourceforge page for this script is appended to profile

$Aim->registerHandler($function_name,$command)
This is by far the best thing about the new release.
For more information please reas supplement.txt. It is not included here because of the sheer size of the document.
supplement.txt contains full details on using registerHandler and what to expect for each input.

For convenience, I have provided some functions to simplify message processing.

They can be read about in the file "supplement.txt". I chose not to include the text here because it
is a huge document

There are a few things you should note about AIM
1)An incoming message has HTML tags in it. You are responsible for stripping those tags
2)Outgoing messages can have HTML tags, but will work fine if they don't. To include things
  in the time feild next to the users name, send it as a comment

Conclusion:
The class is released under the LGPL. If you have any bug reports, comments, questions
feature requests, or want to help/show me what you've created with this(I am very interested in this),
please drop me an email: pickleman78@users.sourceforge.net. This code was written by
Jeremy(a.k.a pickleman78) and Rajiv M (a.k.a compwiz562).

Special thanks:
I'd like to thank all of the people who have contributed ideas, testing, bug reports, and code additions to
this project. I'd like to especially thank Rajiv, who has done do much for the project, and has kept this documnet
looking nice. He also has done alot of testing of this script too. I'd also like to thank SpazLink for his help in
testing. And finally I'd like to thank Jeffery Grafton, whose script inspired me to start this project.


code:
<?php
/*
*	PHPTOCLIB: A library for AIM connectivity through PHP using the TOC protocal.
*
*	This library is free software; you can redistribute it and/or
*	modify it under the terms of the GNU Lesser General Public
*	License as published by the Free Software Foundation; either
*	version 2.1 of the License, or (at your option) any later version.
*
*	This library is distributed in the hope that it will be useful,
*	but WITHOUT ANY WARRANTY; without even the implied warranty of
*	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
*	Lesser General Public License for more details.
*
*	You should have received a copy of the GNU Lesser General Public
*	License along with this library; if not, write to the Free Software
*	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*
*/
/**
* The version of PHPTOCLIB we are running right now
*
* @access private
* @var int
*/
define("PHPTOCLIB_VERSION","1.0.0 RC1");

// Prevents Script from Timing Out
//set_time_limit(0);

// Constant Declarations

/**
* Maximum size for a direct connection IM in bytes
*
* @access private
* @var int
*/

define("MAX_DIM_SIZE",3072); //Default to 3kb

/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_WARN",74);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_MSG",75);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_UPDATEBUDDY",76);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_SIGNON",77);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_NICK",78);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_ERROR",79);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_CHATJ",80);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_CHATI",81);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_CHATUPDBUD",82);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_CHATINV",83);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_CHATLE",84);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_URL",85);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_NICKSTAT",86);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_PASSSTAT",87);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_RVOUSP",88);
/**
* Internally used for message type
*
* @access private
* @var int
*/
define("AIM_TYPE_NOT_IMPLEMENTED",666);

/**
* Internally used for connection type
*
* Internal type for a normal connection
*
* @access private
* @var int
*/
define("CONN_TYPE_NORMAL",1);
/**
* Internally used for connection type
*
* Internal type of a Dirct Connection
*
* @access private
* @var int
*/
define("CONN_TYPE_DC",2);
/**
* Internally used for connection type
*
*Internal type for a file transfer connection
*
* @access private
* @var int
*/
define("CONN_TYPE_FT",3);
/**
* Internally used for connection type
*
*Internal type for a file get connection
*
* @access private
* @var int
*/
define("CONN_TYPE_FTG",4);

/**
* Maximum size for a TOC packet
*
* @access private
* @var int
*/
define("MAX_PACKLENGTH",2048);

/**
* TOC packet type
*
* @access private
* @var int
*/
define("SFLAP_TYPE_SIGNON",1);
/**
* TOC packet type
*
* @access private
* @var int
*/
define("SFLAP_TYPE_DATA",2);
/**
* TOC packet type
*
* @access private
* @var int
*/
define("SFLAP_TYPE_ERROR",3);
/**
* TOC packet type
*
* @access private
* @var int
*/
define("SFLAP_TYPE_SIGNOFF",4);
/**
* TOC packet type
*
* @access private
* @var int
*/
define("SFLAP_TYPE_KEEPALIVE",5);
/**
* TOC packet type
*
* @access private
* @var int
*/
define("SFLAP_MAX_LENGTH",1024);

/**
* Service UID for a voice connection
*
* @access private
* @var int
*/
define('VOICE_UID', '09461341-4C7F-11D1-8222-444553540000');
/**
* Service UID for file sending
*
* @access private
* @var int
*/
define('FILE_SEND_UID', '09461343-4C7F-11D1-8222-444553540000');
/**
* Service UID for file getting
*
* @access private
* @var int
*/
define('FILE_GET_UID', '09461348-4C7F-11D1-8222-444553540000');
/**
* Service UID for Direct connections
*
* @access private
* @var int
*/
define('IMAGE_UID', '09461345-4C7F-11D1-8222-444553540000');
/**
* Service UID for Buddy Icons
*
* @access private
* @var int
*/
define('BUDDY_ICON_UID', '09461346-4C7F-11D1-8222-444553540000');
/**
* Service UID for stocks
*
* @access private
* @var int
*/
define('STOCKS_UID', '09461347-4C7F-11D1-8222-444553540000');
/**
* Service UID for games
*
* @access private
* @var int
*/
define('GAMES_UID', '0946134a-4C7F-11D1-8222-444553540000');

/**
* FLAP return code
*
* @access private
* @var int
*/
define("SFLAP_SUCCESS",0);
/**
* FLAP return code
*
* @access private
* @var int
*/
define("SFLAP_ERR_UNKNOWN",1);
/**
* FLAP return code
*
* @access private
* @var int
*/
define("SFLAP_ERR_ARGS",2);
/**
* FLAP return code
*
* @access private
* @var int
*/
define("SFLAP_ERR_LENGTH",3);
/**
* FLAP return code
*
* @access private
* @var int
*/
define("SFLAP_ERR_READ",4);
/**
* FLAP return code
*
* @access private
* @var int
*/
define("SFLAP_ERR_SEND",5);

/**
* FLAP version number
*
* @access private
* @var int
*/
define("SFLAP_FLAP_VERSION",1);
/**
* FLAP TLV code
*
* @access private
* @var int
*/
define("SFLAP_TLV_TAG",1);
/**
* Bytes in a FLAP header
*
* @access private
* @var int
*/
define("SFLAP_HEADER_LEN",6);

/**
 * PHPTocLib AIM Class
 *
 * @author Jeremy Bryant <pickleman78@users.sourceforge.net>
 * @author Rajiv Makhijani <rajiv@blue-tech.org>
 * @package phptoclib
 * @version 1.0RC1
 * @copyright 2005
 * @access public
 *
 */
class Aim
{
	/**
	 * AIM ScreenName
	 *
	 * @var String
	 * @access private
	 */
	var $myScreenName;

	/**
	 * AIM Password (Plain Text)
	 *
	 * @var String
	 * @access private
	 */
	var $myPassword;

	/**
	 * AIM TOC Server
	 *
	 * @var String
	 * @access public
	 */
	var $myServer="toc.oscar.aol.com";

	/**
	 * AIM Formatted ScreenName
	 *
	 * @var String
	 * @access private
	 */
	var $myFormatSN;

	/**
	 * AIM TOC Server Port
	 *
	 * @var String
	 * @access public
	 */
	var $myPort="5190";

	/**
	 * Profile Data
	 * Use setProfile() to update
	 *
	 * @var String
	 * @access private
	 */
	var $myProfile="Powered by phpTOCLib. Please visit http://sourceforge.net/projects/phptoclib for more information";     //The profile of the bot

	/**
	 * Socket Connection Resource ID
	 *
	 * @var Resource
	 * @access private
	 */
	var $myConnection;  //Connection resource ID

	/**
	 * Roasted AIM Password
	 *
	 * @var String
	 * @access private
	 */
	var $myRoastedPass;

	/**
	 * Last Message Recieved From Server
	 *
	 * @var String
	 * @access private
	 */
	var $myLastReceived;

	/**
	 * Current Seq Number Used to Communicate with Server
	 *
	 * @var Integer
	 * @access private
	 */
	var $mySeqNum;

	 /**
	 * Current Warning Level
	 * Getter: getWarning()
	 * Setter: setWarning()
	 *
	 * @var Integer
	 * @access private
	 */
	var $myWarnLevel;   //Warning Level of the bot

	 /**
	 * Auth Code
	 *
	 * @var Integer
	 * @access private
	 */
	var $myAuthCode;

	/**
	 * Buddies
	 * Getter: getBuddies()
	 *
	 * @var Array
	 * @access private
	 */
	var $myBuddyList;

	/**
	 * Blocked Buddies
	 * Getter: getBlocked()
	 *
	 * @var Array
	 * @access private
	 */
	var $myBlockedList;

	/**
	 * Permited Buddies
	 * Getter: getBlocked()
	 *
	 * @var Array
	 * @access private
	 */
	var $myPermitList;

	/**
	 * Permit/Deny Mode
	 * 1 - Allow All
	 * 2 - Deny All
	 * 3 - Permit only those on your permit list
	 * 4 - Permit all those not on your deny list
	 *
	 * @var Integer
	 * @access private
	 */
	var $myPdMode;

	//Below variables added 4-29 by Jeremy: Implementing chat

	/**
	 * Contains Chat Room Info
	 * $myChatRooms['roomid'] = people in room
	 *
	 * @var Array
	 * @access private
	 */
	var $myChatRooms;

	//End of chat implementation

	/**
	 * Event Handler Functions
	 *
	 * @var Array
	 * @access private
	 */
	var $myEventHandlers = array();

	/**
	 * Array of direct connection objects(including file transfers)
	 *
	 * @var Array
	 * @access private
	 */
	var $myDirectConnections = array();

	/**
	 * Array of the actual connections
	 *
	 * @var Array
	 * @access private
	 */
	var $myConnections = array();

	/**
	 * The current state of logging
	 *
	 * @var Boolean
	 * @access private
	 */

	var $myLogging = false;

    /**
	 * Constructor
	 *
	 * Permit/Deny Mode Options
	 * 1 - Allow All
	 * 2 - Deny All
	 * 3 - Permit only those on your permit list
	 * 4 - Permit all those not on your deny list
	 *
	 * @param String $sn AIM Screenname
	 * @param String $password AIM Password
	 * @param Integer $pdmode Permit/Deny Mode
	 * @access public
	 */
	function Aim($sn, $password, $pdmode)
    {
        //Constructor assignment
		$this->myScreenName = $this->normalize($sn);
		$this->myPassword = $password;
		$this->myRoastedPass = $this->roastPass($password);
		$this->mySeqNum = 1;
		$this->myConnection = 0;
		$this->myWarnLevel = 0;
		$this->myAuthCode = $this->makeCode();
		$this->myPdMode = $pdmode;
		$this->myFormatSN = $this->myScreenName;

		$this->log("PHPTOCLIB v" . PHPTOCLIB_VERSION . " Object Created");

	}

	/**
	 * Enables debug logging (Logging is disabled by default)
	 *
	 *
	 * @access public
	 * @return void
	 */

	function setLogging($enable)
	{
		$this->myLogging=$enable;
	}

	function log($data)
	{
	    if($this->myLogging){
            error_log($data);
        }
	}

	 /**
	 * Logs a packet
	 *
	 *
	 * @access private
	 * @param Array $packary Packet
	 * @param String $in Prepend
	 * @return void
	 */
	function logPacket($packary,$in)
	{
		if(!$this->myLogging || sizeof($packary)<=0 || (@strlen($packary['decoded'])<=0 && @isset($packary['decoded'])))
		   return;
		$towrite=$in . ":  ";
		foreach($packary as $k=>$d)
		{
			$towrite.=$k . ":" . $d . "\r\n";
		}
		$towrite.="\r\n\r\n";
		$this->log($towrite);
	}
	/**
	 * Roasts/Hashes Password
	 *
	 * @param String $password Password
	 * @access private
	 * @return String Roasted Password
	 */
	function roastPass($password)
	{
		$roaststring = 'Tic/Toc';
		$roasted_password = '0x';
		for ($i = 0; $i < strlen($password); $i++)
			$roasted_password .= bin2hex($password[$i] ^ $roaststring[($i % 7)]);
		return $roasted_password;
	}

	/**
	 * Access Method for myScreenName
	 *
	 * @access public
	 * @param $formated Returns formatted Screenname if true as returned by server
	 * @return String Screenname
	 */
	function getMyScreenName($formated = false)
	{
		if ($formated)
		{
			return $this->myFormatSN;
		}
		else
		{
			return $this->normalize($this->myScreenName);
		}
	}

	/**
	 * Generated Authorization Code
	 *
	 * @access private
	 * @return Integer Auth Code
	 */
	function makeCode()
	{
		$sn = ord($this->myScreenName[0]) - 96;
		$pw = ord($this->myPassword[0]) - 96;
		$a = $sn * 7696 + 738816;
		$b = $sn * 746512;
		$c = $pw * $a;

		return $c - $a + $b + 71665152;
	}

	/**
	 * Reads from Socket
	 *
	 * @access private
	 * @return String Data
	 */
	function sflapRead()
	{
		if ($this->socketcheck($this->myConnection))
		{
			$this->log("Disconnected.... Reconnecting in 60 seconds");
			sleep(60);
			$this->signon();
		}

		$header = fread($this->myConnection,SFLAP_HEADER_LEN);

		if (strlen($header) == 0)
		{
			$this->myLastReceived = "";
			return "";
		}
		$header_data = unpack("aast/Ctype/nseq/ndlen", $header);
		$this->log(" . ", false);
		$packet = fread($this->myConnection, $header_data['dlen']);
		if (strlen($packet) <= 0 && $sockinfo['blocked'])
			$this->derror("Could not read data");

		if ($header_data['type'] == SFLAP_TYPE_SIGNON)
		{
			$packet_data=unpack("Ndecoded", $packet);
		}

		if ($header_data['type'] == SFLAP_TYPE_KEEPALIVE)
		{
			$this->myLastReceived = '';
			return 0;
		}
		else if (strlen($packet)>0)
		{
			$packet_data = unpack("a*decoded", $packet);
		}
		$this->log("socketcheck check now");
		if ($this->socketcheck($this->myConnection))
		{
			$this->derror("Connection ended unexpectedly");
		}

		$data = array_merge($header_data, $packet_data);
		$this->myLastReceived = $data;
		$this->logPacket($data,"in");
		return $data;
    }

	/**
	 * Sends Data on Socket
	 *
	 * @param String $sflap_type Type
	 * @param String $sflap_data Data
	 * @param boolean $no_null No Null
	 * @param boolean $formatted Format
	 * @access private
	 * @return String Roasted Password
	 */
	function sflapSend($sflap_type, $sflap_data, $no_null, $formatted)
	{
		$packet = "";
		if (strlen($sflap_data) >= MAX_PACKLENGTH)
			$sflap_data = substr($sflap_data,0,MAX_PACKLENGTH);

		if ($formatted)
		{
			$len = strlen($sflap_len);
			$sflap_header = pack("aCnn",'*', $sflap_type, $this->mySeqNum, $len);
			$packet = $sflap_header . $sflap_data;
		} else {
			if (!$no_null)
			{
				$sflap_data = str_replace("\0","", trim($sflap_data));
				$sflap_data .= "\0";
			}
			$data = pack("a*", $sflap_data);
			$len = strlen($sflap_data);
			$header = pack("aCnn","*", $sflap_type, $this->mySeqNum, $len);
			$packet = $header . $data;
		}

		//Make sure we are still connected
		if ($this->socketcheck($this->myConnection))
		{
			$this->log("Disconnected.... reconnecting in 60 seconds");
			sleep(60);
			$this->signon();
		}
		$sent = fputs($this->myConnection, $packet) or $this->derror("Error sending packet to AIM");
		$this->mySeqNum++;
		sleep(ceil($this->myWarnLevel/10));
		$this->logPacket(array($sflap_type,$sflap_data),"out");
	}

	/**
	 * Escape the thing that TOC doesn't like,that would be
	 * ",', $,{,},[,]
	 *
	 * @param String $data Data to Escape
	 * @see decodeData
	 * @access private
	 * @return String $data Escaped Data
	 */
	function encodeData($data)
	{
		$data = str_replace('"','\"', $data);
		$data = str_replace('$','\$', $data);
		$data = str_replace("'","\'", $data);
		$data = str_replace('{','\{', $data);
		$data = str_replace('}','\}', $data);
		$data = str_replace('[','\[', $data);
		$data = str_replace(']','\]', $data);
		return $data;
	}

	/**
	 * Unescape data TOC has escaped
	 * ",', $,{,},[,]
	 *
	 * @param String $data Data to Unescape
	 * @see encodeData
	 * @access private
	 * @return String $data Unescape Data
	 */
	function decodeData($data)
	{
		$data = str_replace('\"','"', $data);
		$data = str_replace('\$','$', $data);
		$data = str_replace("\'","'", $data);
		$data = str_replace('\{','{', $data);
		$data = str_replace('\}','}', $data);
		$data = str_replace('\[','[', $data);
		$data = str_replace('\]',']', $data);
		$data = str_replace('"','"', $data);
		$data = str_replace('&','&', $data);
		return $data;
	}

	/**
	 * Normalize ScreenName
	 * no spaces and all lowercase
	 *
	 * @param String $nick ScreenName
	 * @access public
	 * @return String $nick Normalized ScreenName
	 */
	function normalize($nick)
	{
		$nick = str_replace(" ","", $nick);
		$nick = strtolower($nick);
		return $nick;
	}

	/**
	 * Sets internal info with update buddy
	 * Currently only sets warning level
	 *
	 * @access public
	 * @return void
	 */
	function setMyInfo()
	{
		//Sets internal values bvase on the update buddy command
		$this->log("Setting my warning level ...");
		$this->sflapSend(SFLAP_TYPE_DATA,"toc_get_status " . $this->normalize($this->myScreenName),0,0);
		//The rest of this will now be handled by the other functions. It is assumed
		//that we may have other data queued in the socket, do we should just add this
		//message to the queue instead of trying to set it in here
	}

	/**
	 * Connects to AIM and Signs On Using Info Provided in Constructor
	 *
	 * @access public
	 * @return void
	 */
	function signon()
	{
		$this->log("Ready to sign on to the server");
		$this->myConnection = fsockopen($this->myServer, $this->myPort, $errno, $errstr,10) or die("$errorno:$errstr");
		$this->log("Connected to server");
		$this->mySeqNum = (time() % 65536); //Select an arbitrary starting point for
										  //sequence numbers
		if (!$this->myConnection)
			$this->derror("Error connecting to toc.oscar.aol.com");
		$this->log("Connected to AOL");
		//Send the flapon packet
		fputs($this->myConnection,"FLAPON\r\n\n\0"); //send the initial handshake
		$this->log("Sent flapon");
		$this->sflapRead();  //Make sure the server responds with what we expect
		if (!$this->myLastReceived)
			$this->derror("Error sending the initialization string");

		//send the FLAP SIGNON packet back with what it needs
		//There are 2 parts to the signon packet. They are sent in succession, there
		//is no indication if either packet was correctly sent
		$signon_packet = pack("Nnna".strlen($this->myScreenName),1,1,strlen($this->myScreenName), $this->myScreenName);
		$this->sflapSend(SFLAP_TYPE_SIGNON, $signon_packet,1,0);
		$this->log("sent signon packet part one");

		$signon_packet_part2 = 'toc2_signon login.oscar.aol.com 29999 ' . $this->myScreenName . ' ' . $this->myRoastedPass . ' english-US "TIC:TOC2:REVISION" 160 ' . $this->myAuthCode;
		$this->log($signon_packet_part2 . "");
		$this->sflapSend(SFLAP_TYPE_DATA, $signon_packet_part2,0,0);
		$this->log("Sent signon packet part 2... Awaiting response...");

		$this->sflapRead();
		$this->log("Received Sign on packet, beginning initilization...");
		$message = $this->getLastReceived();
		$this->log($message . "\n");
		if (strstr($message,"ERROR:"))
		{
			$this->onError($message);
			die("Fatal signon error");
		}
		stream_set_timeout($this->myConnection,2);
		//The information sent before the config2 command is utterly useless to us
		//So we will just skim through them until we reach it

		//Add the first entry to the connection array
		$this->myConnections[] = $this->myConnection;

		//UPDATED 4/12/03: Now this will use the receive function and send the
		//received messaged to the assigned handlers. This is where the signon
		//method has no more use

		$this->log("Done with signon proccess");
		//socket_set_blocking($this->myConnection,false);
	}

	/**
	 * Sends Instant Message
	 *
	 * @param String $to Message Recipient SN
	 * @param String $message Message to Send
	 * @param boolean $auto Sent as Auto Response / Away Message Style
	 * @access public
	 * @return void
	 */
	function sendIM($to, $message, $auto = false)
	{
		if ($auto) $auto = "auto";
		else $auto = "";
		$to = $this->normalize($to);
		$message = $this->encodeData($message);
		$command = 'toc2_send_im "' . $to . '" "' . $message . '" ' .  $auto;
		$this->sflapSend(SFLAP_TYPE_DATA, trim($command),0,0);
		$cleanedmessage = str_replace("<br>", "   ", $this->decodeData($message));
		$cleanedmessage = strip_tags($cleanedmessage);
		$this->log("TO - " . $to . " : " . $cleanedmessage);
	}

	/**
	 * Set Away Message
	 *
	 * @param String $message Away message (some HTML supported).
	 *   Use null to remove the away message
	 * @access public
	 * @return void
	 */
	function setAway($message)
	{
		$message = $this->encodeData($message);
		$command = 'toc_set_away "' . $message . '"';
		$this->sflapSend(SFLAP_TYPE_DATA, trim($command),0,0);
		$this->log("SET AWAY MESSAGE - " . $this->decodeData($message));
	}

	/**
	 * Fills Buddy List
	 * Not implemented fully yet
	 *
	 * @access public
	 * @return void
	 */
	function setBuddyList()
	{
		//This better be the right message
		$message = $this->myLastReceived['decoded'];
		if (strpos($message,"CONFIG2:") === false)
		{
			$this->log("setBuddyList cannot be called at this time because I got $message");
			return false;
		}
		$people = explode("\n",trim($message,"\n"));
		//The first 3 elements of the array are who knows what, element 3 should be
		//a letter followed by a person
		for($i = 1; $i<sizeof($people); $i++)
		{
   			@list($mode, $name) = explode(":", $people[$i]);
			switch($mode)
			{
				case 'p':
					$this->myPermitList[] = $name;
					break;
				case 'd':
					$this->myBlockedList[] = $name;
					break;
				case 'b':
					$this->myBuddyList[] = $name;
					break;
				case 'done':
	 				break;
				default:
					//
			}
		}
	}

	/**
	 * Adds buddy to Permit list
	 *
	 * @param String $buddy Buddy's Screenname
	 * @access public
	 * @return void
	 */
	function addPermit($buddy)
	{
		$this->sflapSend(SFLAP_TYPE_DATA,"toc2_add_permit " . $this->normalize($buddy),0,0);
		$this->myPermitList[] = $this->normalize($buddy);
		return 1;
	}

	/**
	 * Blocks buddy
	 *
	 * @param String $buddy Buddy's Screenname
	 * @access public
	 * @return void
	 */
	function blockBuddy($buddy)
	{
		$this->sflapSend(SFLAP_TYPE_DATA,"toc2_add_deny " . $this->normalize($buddy),0,0);
		$this->myBlockedList[] = $this->normalize($buddy);
		return 1;
	}

	/**
	 * Returns last message received from server
	 *
	 * @access private
	 * @return String Last Message from Server
	 */
	function getLastReceived()
	{
		if (@$instuff = $this->myLastReceived['decoded']){
			return $this->myLastReceived['decoded'];
		}else{
			return;
		}
	}

	/**
	 * Returns Buddy List
	 *
	 * @access public
	 * @return array Buddy List
	 */
	function getBuddies()
	{
		return $this->myBuddyList;
	}

	/**
	 * Returns Permit List
	 *
	 * @access public
	 * @return array Permit List
	 */
	function getPermit()
	{
		return $this->myPermitList;
	}

	/**
	 * Returns Blocked Buddies
	 *
	 * @access public
	 * @return array Blocked List
	 */
	function getBlocked()
	{
		return $this->myBlockedList;
	}

	/**
	 * Reads and returns data from server
	 *
	 * This is a wrapper for $Aim->sflap_read(), and only returns the $this->myLastReceived['data']
	 * portion of the message. It is preferred that you do not call $Aim->sflap_read() and use this
	 * function instead. This function has a return value. Calling this prevents the need to call
	 * $Aim->getLastReceived()
	 *
	 * @access public
	 * @return String Data recieved from server
	 */
	function read_from_aim()
	{
		$this->sflapRead();
		$returnme = $this->getLastReceived();
		return $returnme;
	}

	/**
	 * Sets current internal warning level
	 *
	 * This allows you to update the bots warning level when warned.
	 *
	 * @param int Warning Level %
	 * @access private
	 * @return void
	 */
	function setWarningLevel($warnlevel)
	{
		$this->myWarnLevel = $warnlevel;
	}

	/**
	 * Warns / "Evils" a User
	 *
	 * To successfully warn another user they must have sent you a message.
	 * There is a limit on how much and how often you can warn another user.
	 * Normally when you warn another user they are aware who warned them,
	 * however there is the option to warn anonymously.  When warning anon.
	 * note that the warning is less severe.
	 *
	 * @param String $to Screenname to warn
	 * @param boolean $anon Warn's anonymously if true. (default = false)
	 * @access public
	 * @return void
	 */
	function warnUser($to, $anon = false)
	{
		if (!$anon)
			$anon = '"norm"';

		else
			$anon = '"anon"';
		$this->sflapSend(SFLAP_TYPE_DATA,"toc_evil " . $this->normalize($to) . " $anon",0,0);
	}

	/**
	 * Returns warning level of bot
	 *
	 * @access public
	 * @return void
	 */
	function getWarningLevel()
	{
		return $this->myWarningLevel;
	}

	/**
	 * Sets bot's profile/info
	 *
	 * Limited to 1024 bytes.
	 *
	 * @param String $profiledata Profile Data (Can contain limited html: br,hr,font,b,i,u etc)
	 * @param boolean $poweredby If true, appends link to phpTOCLib project to profile
	 * @access public
	 * @return void
	 */
	function setProfile($profiledata, $poweredby = false)
	{
		if ($poweredby == false){
			$this->myProfile = $profiledata;
		}else{
			$this->myProfile = $profiledata . "<font size=1 face=tahoma><br><br>Powered by phpTOCLib<br>http://sourceforge.net/projects/phptoclib</font>";
		}

		$this->sflapSend(SFLAP_TYPE_DATA,"toc_set_info \"" . $this->encodeData($this->myProfile) . "\"",0,0);
		$this->setMyInfo();
		$this->log("Profile has been updated...");
	}

	//6/29/04 by Jeremy:
	//Added mthod to accept a rvous,decline it, and
	//read from the rvous socket

	//Decline

	/**
	 * Declines a direct connection request (rvous)
	 *
	 * @param String $nick ScreenName request was from
	 * @param String $cookie Request cookie (from server)
	 * @param String $uuid UUID
	 *
	 * @access public
	 * @return void
	 */
	function declineRvous($nick, $cookie, $uuid)
	{
		$nick = $this->normalize($nick);
		$this->sflapSend(SFLAP_TYPE_DATA,"toc_rvous_cancel $nick $cookie $uuid",0,0);
	}

	/**
	 * Accepts a direct connection request (rvous)
	 *
	 * @param String $nick ScreenName request was from
	 * @param String $cookie Request cookie (from server)
	 * @param String $uuid UUID
	 * @param String $vip IP of User DC with
	 * @param int $port Port number to connect to
	 *
	 * @access public
	 * @return void
	 */
	function acceptRvous($nick, $cookie, $uuid, $vip, $port)
	{
		$this->sflapSend(SFLAP_TYPE_DATA,"toc_rvous_accept $nick $cookie $uuid",0,0);

		//Now open the connection to that user
		if ($uuid == IMAGE_UID)
		{
			$dcon = new Dconnect($vip, $port);
		}
		else if ($uuid == FILE_SEND_UID)
		{
			$dcon = new FileSendConnect($vip, $port);
		}
		if (!$dcon->connected)
		{
			$this->log("The connection failed");
			return false;
		}

		//Place this dcon object inside the array
		$this->myDirectConnections[] = $dcon;
		//Place the socket in an array to
		$this->myConnections[] = $dcon->sock;

		//Get rid of the first packet because its worthless
		//and confusing
		$dcon->readDIM();
		//Assign the cookie
		$dcon->cookie = $dcon->lastReceived['cookie'];
		$dcon->connectedTo = $this->normalize($nick);
		return $dcon;
	}

	/**
	 * Sends a Message over a Direct Connection
	 *
	 * Only works if a direct connection is already established with user
	 *
	 * @param String $to Message Recipient SN
	 * @param String $message Message to Send
	 *
	 * @access public
	 * @return void
	 */
	function sendDim($to, $message)
	{
		//Find the connection
		for($i = 0;$i<sizeof($this->myDirectConnections);$i++)
		{
			if ($this->normalize($to) == $this->myDirectConnections[$i]->connectedTo && $this->myDirectConnections[$i]->type == CONN_TYPE_DC)
			{
				$dcon = $this->myDirectConnections[$i];
				break;
			}
		}
		if (!$dcon)
		{
			$this->log("Could not find a direct connection to $to");
			return false;
		}
		$dcon->sendMessage($message, $this->normalize($this->myScreenName));
		return true;
	}

	/**
	 * Closes an established Direct Connection
	 *
	 * @param DConnect $dcon Direct Connection Object to Close
	 *
	 * @access public
	 * @return void
	 */
	function closeDcon($dcon)
	{

		$nary = array();
		for($i = 0;$i<sizeof($this->myConnections);$i++)
		{
			if ($dcon->sock == $this->myConnections[$i])
				unset($this->myConnections[$i]);
		}

		$this->myConnections = array_values($this->myConnections);
		unset($nary);
		$nary2 = array();

		for($i = 0;$i<sizeof($this->myDirectConnections);$i++)
		{
			if ($dcon == $this->myDirectConnections[$i])
				unset($this->myDirectConnections[$i]);
		}
		$this->myDirectConnections = array_values($this->myDirectConnections);
		$dcon->close();
		unset($dcon);
	}

	//Added 4/29/04 by Jeremy:
	//Various chat related methods

	/**
	 * Accepts a Chat Room Invitation (Joins room)
	 *
	 * @param String $chatid ID of Chat Room
	 *
	 * @access public
	 * @return void
	 */
	function joinChat($chatid)
	{
		$this->sflapSend(SFLAP_TYPE_DATA,"toc_chat_accept " . $chatid,0,0);
	}

	/**
	 * Leaves a chat room
	 *
	 * @param String $chatid ID of Chat Room
	 *
	 * @access public
	 * @return void
	 */
	function leaveChat($chatid)
	{
		$this->sflapSend(SFLAP_TYPE_DATA,"toc_chat_leave " . $chatid,0,0);
	}

	/**
	 * Sends a message in a chat room
	 *
	 * @param String $chatid ID of Chat Room
	 * @param String $message Message to send
	 *
	 * @access public
	 * @return void
	 */
	function chatSay($chatid, $message)
	{
		$this->sflapSend(SFLAP_TYPE_DATA,"toc_chat_send " . $chatid . " \"" . $this->encodeData($message) . "\"",0,0);
	}

	/**
	 * Invites a user to a chat room
	 *
	 * @param String $chatid ID of Chat Room
	 * @param String $who Screenname of user
	 * @param String $message Note to include with invitiation
	 *
	 * @access public
	 * @return void
	 */
	function chatInvite($chatid, $who, $message)
	{
		$who = $this->normalize($who);
		$this->sflapSend(SFLAP_TYPE_DATA,"toc_chat_invite " . $chatid . " \"" . $this->encodeData($message) . "\" " . $who,0,0);
	}

	/**
	 * Joins/Creates a new chat room
	 *
	 * @param String $name Name of the new chat room
	 * @param String $exchange Exchange of new chat room
	 *
	 * @access public
	 * @return void
	 */
	function joinNewChat($name, $exchange)
	{
		//Creates a new chat
		$this->sflapSend(SFLAP_TYPE_DATA,"toc_chat_join " . $exchange . " \"" . $name . "\"",0,0);
	}

	/**
	 * Disconnect error handler, attempts to reconnect in 60 seconds
	 *
	 * @param String $message Error message (desc of where error encountered etc)
	 *
	 * @access private
	 * @return void
	 */
	function derror($message)
	{
		$this->log($message);
		$this->log("Error");
		fclose($this->myConnection);
		if ((time() - $GLOBALS['errortime']) <  600){
			$this->log("Reconnecting in 60 Seconds");
			sleep(60);
		}
		$this->signon();
		$GLOBALS['errortime'] = time();
	}

	/**
	 * Returns connection type of socket (main or rvous etc)
	 *
	 * Helper method for recieve()
	 *
	 * @param Resource $sock Socket to determine type for
	 *
	 * @access private
	 * @return void
	 * @see receive
	 */
	function connectionType($sock)
	{
		//Is it the main connection?
		if ($sock == $this->myConnection)
		   return CONN_TYPE_NORMAL;
		else
		{
			for($i = 0;$i<sizeof($this->myDirectConnections);$i++)
			{
				if ($sock == $this->myDirectConnections[$i]->sock)
				    return $this->myDirectConnections[$i]->type;
			}
		}
		return false;
	}

	/**
	 * Checks for new data and calls appropriate methods
	 *
	 * This method is usually called in an infinite loop to keep checking for new data
	 *
	 * @access public
	 * @return void
	 * @see connectionType
	 */
	function receive()
	{
		//This function will be used to get the incoming data
		//and it will be used to call the event handlers

		//First, get an array of sockets that have data that is ready to be read
		$ready = array();
		$ready = $this->myConnections;
		$numrdy = stream_select($ready, $w = NULL, $x = NULL,NULL);

		//Now that we've waited for something, go through the $ready
		//array and read appropriately

		for($i = 0;$i<sizeof($ready);$i++)
		{
			//Get the type
			$type = $this->connectionType($ready[$i]);
			if ($type == CONN_TYPE_NORMAL)
			{
				//Next step:Get the data sitting in the socket
				$message = $this->read_from_aim();
				if (strlen($message) <= 0)
				{
					return;
				}

				//Third step: Get the command from the server
				@list($cmd, $rest) = explode(":", $message);

				//Fourth step, take the command, test the type, and pass it off
				//to the correct internal handler. The internal handler will
				//do what needs to be done on the class internals to allow
				//it to work, then proceed to pass it off to the user created handle
				//if there is one
				$this->log($cmd);
				switch($cmd)
				{
					case 'SIGN_ON':
						$this->onSignOn($message);
						break;
					case 'CONFIG2':
						$this->onConfig($message);
						break;
					case 'ERROR':
						$this->onError($message);
						break;
					case 'NICK':
						$this->onNick($message);
						break;
					case 'IM_IN2':
						$this->onImIn($message);
						break;
					case 'UPDATE_BUDDY2':
						$this->onUpdateBuddy($message);
						break;
					case 'EVILED':
						$this->onWarn($message);
						break;
					case 'CHAT_JOIN':
						$this->onChatJoin($message);
						break;
					case 'CHAT_IN':
						$this->onChatIn($message);
						break;
					case 'CHAT_UPDATE_BUDDY':
						$this->onChatUpdate($message);
						break;
					case 'CHAT_INVITE':
						$this->onChatInvite($message);
						break;
					case 'CHAT_LEFT':
						$this->onChatLeft($message);
						break;
					case 'GOTO_URL':
						$this->onGotoURL($message);
						break;
					case 'DIR_STATUS':
						$this->onDirStatus($message);
						break;
					case 'ADMIN_NICK_STATUS':
						$this->onAdminNick($message);
						break;
					case 'ADMIN_PASSWD_STATUS':
						$this->onAdminPasswd($message);
						break;
					case 'PAUSE':
						$this->onPause($message);
						break;
					case 'RVOUS_PROPOSE':
						$this->onRvous($message);
						break;
					default:
						$this->log("Fell through: $message");
						$this->CatchAll($message);
						break;
				}
			}
			else
			{
				for($j = 0;$j<sizeof($this->myDirectConnections);$j++)
				{
					if ($this->myDirectConnections[$j]->sock == $ready[$i])
					{
						$dcon = $this->myDirectConnections[$j];
						break;
					}
				}
				//Now read from the dcon
				if ($dcon->type == CONN_TYPE_DC)
				{
					if ($dcon->readDIM() == false)
					{
						$this->closeDcon($dcon);
						continue;
					}

					$message['message'] = $dcon->lastMessage;
					if ($message['message'] == "too big")
					{
						$this->sendDim("Connection dropped because you sent a message larger that " . MAX_DCON_SIZE . " bytes.", $dcon->connectedTo);
						$this->closeDcon($dcon);
						continue;
					}
					$message['from'] = $dcon->connectedTo;
					$this->onDimIn($message);
				}
			}
		}
        $this->conn->myLastReceived="";
		//Now get out of this function because the handlers should take care
		//of everything
	}

	//The next block of code is all the event handlers needed by the class
	//Some are left blank and only call the users handler because the class
	//either does not support the command, or cannot do anything with it
	// ---------------------------------------------------------------------

	/**
	 * Direct IM In Event Handler
	 *
	 * Called when Direct IM is received.
	 * Call's user handler (if available) for DimIn.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onDimIn($data)
	{
		$this->callHandler("DimIn", $data);
	}

	/**
	 * Sign On Event Handler
	 *
	 * Called when Sign On event occurs.
	 * Call's user handler (if available) for SIGN_ON.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onSignOn($data)
	{
		$this->callHandler("SignOn", $data);
	}

	/**
	 * Config Event Handler
	 *
	 * Called when Config data received.
	 * Call's user handler (if available) for Config.
	 *
	 * Loads buddy list and other info
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onConfig($data)
	{
		$this->log("onConfig Message: " . $data);

		if (strpos($data,"CONFIG2:") === false)
		{
			$this->log("get_buddy_list cannot be called at this time because I got $data");
			//return false;
		}
		$people = explode("\n",trim($data,"\n"));
		//The first 3 elements of the array are who knows what, element 3 should be
		//a letter followed by a person

		//AIM decided to add this wonderful new feature, the recent buddy thing, this kind of
		//messes this funtion up, so we need to adapt it... unfortuneately, its not really
		//clear how this works, so we are just going to add their name to the permit list.

		//Recent buddies I believe are in the format
		//number:name:number.... I think the first number counts down from 25 how long its
		//been... but I don't know the second number,,,,

		//TODO: Figure out the new recent buddies system

		//Note: adding that at the bottom is a quick hack and may have adverse consequences...
		for($i = 1;$i<sizeof($people);$i++)
		{
   			@list($mode, $name) = explode(":", $people[$i]);
			switch($mode)
			{
				case 'p':
					$this->myPermitList[] = $name;
					break;
				case 'd':
					$this->myBlockedList[] = $name;
					break;
				case 'b':
					$this->myBuddyList[] = $name;
					break;
				case 'done':
	 				break;
				default:
					//This is assumed to be recent buddies...
					$this->myPermitList[]=$name;
			}
		}

		//We only get the config message once, so now we should send our pd mode

		$this->sflapSend(SFLAP_TYPE_DATA,"toc2_set_pdmode " . $this->myPdMode,0,0);
		//Adds yourself to the permit list
		//This is to fix an odd behavior if you have nobody on your list
		//the server won't send the config command... so this takes care of it
		$this->sflapSend(SFLAP_TYPE_DATA,"toc2_add_permit " . $this->normalize($this->myScreenName),0,0);

		//Now we allow the user to send a list, update anything they want, etc
		$this->callHandler("Config", $data);
		//Now that we have taken care of what the user wants, send the init_done message
		$this->sflapSend(SFLAP_TYPE_DATA,"toc_init_done",0,0);
		//'VOICE_UID'
		//'FILE_GET_UID'
		//'IMAGE_UID'
		//'BUDDY_ICON_UID'
		//'STOCKS_UID'
		//'GAMES_UID'
		$this->sflapSend(SFLAP_TYPE_DATA, "toc_set_caps " . IMAGE_UID . " " .  FILE_SEND_UID ." " . FILE_GET_UID . " " . BUDDY_ICON_UID . "",0,0);
	}

	/**
	 * Error Event Handler
	 *
	 * Called when an Error occurs.
	 * Call's user handler (if available) for Error.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onError($data)
	{
	    static $errarg = '';
		static $ERRORS = array(
            0=>'Success',
            901 =>'$errarg not currently available',
            902 =>'Warning of $errarg not currently available',
            903 =>'A message has been dropped, you are exceeding
                  the server speed limit',
            911 =>'Error validating input',
            912 =>'Invalid account',
            913 =>'Error encountered while processing request',
            914 =>'Service unavailable',
            950 =>'Chat in $errarg is unavailable.',
            960 =>'You are sending message too fast to $errarg',
            961 =>'You missed an im from $errarg because it was too big.',
            962 =>'You missed an im from $errarg because it was sent too fast.',
            970 =>'Failure',
            971 =>'Too many matches',
            972 =>'Need more qualifiers',
            973 =>'Dir service temporarily unavailable',
            974 =>'Email lookup restricted',
            975 =>'Keyword Ignored',
            976 =>'No Keywords',
            977 =>'Language not supported',
            978 =>'Country not supported',
            979 =>'Failure unknown $errarg',
            980 =>'Incorrect nickname or password.',
            981 =>'The service is temporarily unavailable.',
            982 =>'Your warning level is currently too high to sign on.',
            983 =>'You have been connecting and
               	   disconnecting too frequently.  Wait 10 minutes and try again.
	               If you continue to try, you will need to wait even longer.',
            989 =>'An unknown signon error has occurred $errarg'
            );
		$data_array = explode(":", $data);
		for($i=0; $i<count($data_array); $i++)
		{
            switch($i)
            {
                case 0:
                    $cmd = $data_array[$i];
                    break;
                case 1:
                    $errornum = $data_array[$i];
                    break;
                case 2:
                    $errargs = $data_array[$i];
                    break;
            }
		}
		eval("\$errorstring=\"\$ERRORS[" . $errornum . "]\";");
		$string = "\$errorstring=\"\$ERRORS[$errornum]\";";
		//This is important information! We need
		// a A different outputter for errors
		// b Just to echo it
		//I'm just going to do a straight echo here, becuse we assume that
		//the user will NEED to see this error. An option to supress it will
		//come later I think. Perhaps if we did an error reporting level, similar
		//to PHP's, and we could probably even use PHP's error outputting system
		//I think that may be an idea....

		$this->log($errorstring . "\n");

		$this->callHandler("Error", $data);
	}

	/**
	 * Nick Event Handler
	 *
	 * Called when formatted own ScreenName is receieved
	 * Call's user handler (if available) for Nick.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onNick($data)
	{
		//This is our nick, so set a field called "myFormatSN" which will represent
		//the actual name given by the server to us, NOT the normalized screen name
		@list($cmd, $nick) = explode(":", $data);
		$this->myFormatSN = $nick;

		$this->callHandler("Nick", $data);
	}

	/**
	 * IM In Event Handler
	 *
	 * Called when an Instant Message is received.
	 * Call's user handler (if available) for IMIn.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onImIn($data)
	{
		//Perhaps we should add an internal log for debugging purposes??
		//But now, this should probably be handled by the user purely

		$this->callHandler("IMIn", $data);
	}

	/**
	 * UpdateBuddy Event Handler
	 *
	 * Called when a Buddy Update is receieved.
	 * Call's user handler (if available) for UpdateBuddy.
	 * If info is about self, updates self info (Currently ownly warning).
	 *
	 * ToDo: Keep track of idle, warning etc on Buddy List
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onUpdateBuddy($data)
	{
		//Again, since our class currently does not deal with other people without
		//outside help, then this is also probably best left to the user. Though
		//we should probably allow this to replace the setMyInfo function above
		//by handling the input if and only if it is us
		//Check and see that this is the command expected
		if (strpos($data,"UPDATE_BUDDY2:") == -1)
		{
			$this->log("A different message than expected was received");
			return false;
		}

		//@list($cmd, $info['sn'], $info['online'], $info['warnlevel'], $info['signon'], $info['idle'], $info['uc']) = explode(":", $command['incoming']);

		//@list($cmd, $sn, $online, $warning, $starttime, $idletime, $uc) = explode(":", $data);
		$info = $this->getMessageInfo($data);
		if ($this->normalize($info['sn']) == $this->normalize($this->myScreenName))
		{
			$warning = rtrim($info['warnlevel'],"%");
			$this->myWarnLevel = $warning;
			$this->log("My warning level is $this->myWarnLevel %");
		}

		$this->callHandler("UpdateBuddy", $data);
	}

	/**
	 * Warning Event Handler
	 *
	 * Called when bot is warned.
	 * Call's user handler (if available) for Warn.
	 * Updates internal warning level
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onWarn($data)
	{
		/*
		For reference:
			$command['incoming'] .= ":0";
			$it = explode(":", $command['incoming']);
			$info['warnlevel'] = $it[1];
			$info['from'] = $it[2];
		*/
		//SImply update our warning level
		//@list($cmd, $newwarn, $user) = explode(":", $data);

		$info = $this->getMessageInfo($data);

		$this->setWarningLevel(trim($info['warnlevel'],"%"));
		$this->log("My warning level is $this->myWarnLevel %");

		$this->callHandler("Warned", $data);
	}

	/**
	 * Chat Join Handler
	 *
	 * Called when bot joins a chat room.
	 * Call's user handler (if available) for ChatJoin.
	 * Adds chat room to internal chat room list.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onChatJoin($data)
	{
		@list($cmd, $rmid, $rmname) = explode(":", $data);
		$this->myChatRooms[$rmid] = 0;

		$this->callHandler("ChatJoin", $data);
	}

	/**
	 * Returns number of chat rooms bot is in
	 *
	 * @access public
	 * @param String $data Raw message from server
	 * @return int
	 */
	function getNumChats()
	{
		return count($this->myChatRooms);
	}

	/**
	 * Chat Update Handler
	 *
	 * Called when bot received chat room data (user update).
	 * Call's user handler (if available) for ChatUpdate.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onChatUpdate($data)
	{
		$stuff = explode(":", $data);
		$people = sizeof($stuff);
		$people -= 2;

		$this->callHandler("ChatUpdate", $data);
	}

	/**
	 * Chat Message In Handler
	 *
	 * Called when chat room message is received.
	 * Call's user handler (if available) for ChatIn.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onChatIn($data)
	{
		$this->callHandler("ChatIn", $data);
	}

	/**
	 * Chat Invite Handler
	 *
	 * Called when bot is invited to a chat room.
	 * Call's user handler (if available) for ChatInvite.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onChatInvite($data)
	{
		//@list($cmd, $name, $id, $from, $data) = explode(":", $data,6);
		//$data = explode(":",$data,6);
		//$nm = array();
		//@list($nm['cmd'],$nm['name'],$nm['id'],$nm['from'],$nm['message']) = $data;

		$this->callHandler("ChatInvite", $data);
	}

	/**
	 * Chat Left Handler
	 *
	 * Called when bot leaves a chat room
	 * Call's user handler (if available) for ChatLeft.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onChatLeft($data)
	{
		$info = $this->getMessageInfo($data);
		unset($this->myChatRooms[$info['chatid']]);
		$this->callHandler("ChatLeft", $data);
	}

	/**
	 * Goto URL Handler
	 *
	 * Called on GotoURL.
	 * Call's user handler (if available) for GotoURL.
	 * No detailed info available for this / Unsupported.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onGotoURL($data)
	{
		//This is of no use to the internal class

		$this->callHandler("GotoURL", $data);
	}

	/**
	 * Dir Status Handler
	 *
	 * Called on DirStatus.
	 * Call's user handler (if available) for DirStatus.
	 * No detailed info available for this / Unsupported.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onDirStatus($data)
	{
		//This is not currently suported

		$this->callHandler("DirStatus", $data);
	}

	/**
	 * AdminNick Handler
	 *
	 * Called on AdminNick.
	 * Call's user handler (if available) for AdminNick.
	 * No detailed info available for this / Unsupported.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onAdminNick($data)
	{
		//NOt particularly useful to us
		$this->callHandler("AdminNick", $data);
	}

	/**
	 * AdminPasswd Handler
	 *
	 * Called on AdminPasswd.
	 * Call's user handler (if available) for AdminPasswd.
	 * No detailed info available for this / Unsupported.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onAdminPasswd($data)
	{
		//Also not particlualry useful to the internals
		$this->callHandler("AdminPasswd", $data);
	}

	/**
	 * Pause Handler
	 *
	 * Called on Pause.
	 * Call's user handler (if available) for Pause.
	 * No detailed info available for this / Unsupported.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onPause($data)
	{
		//This is pretty useless to us too...

		$this->callHandler("Pause", $data);
	}

	/**
	 * Direct Connection Handler
	 *
	 * Called on Direct Connection Request(Rvous).
	 * Call's user handler (if available) for Rvous.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function onRvous($data)
	{
		$this->callHandler("Rvous", $data);
	}

	/**
	 * CatchAll Handler
	 *
	 * Called for unrecognized commands.
	 * Logs unsupported messages to array.
	 * Call's user handler (if available) for CatchAll.
	 *
	 * @access private
	 * @param String $data Raw message from server
	 * @return void
	 */
	function CatchAll($data)
	{
		//Add to a log of unsupported messages.

		$this->unsupported[] = $data;
		//$this->log($data);
		//print_r($data);

		$this->callHandler("CatchAll", $data);
	}

	/**
	 * Calls User Handler
	 *
	 * Calls registered handler for a specific event.
	 *
	 * @access private
	 * @param String $event Command (event) name (Rvous etc)
	 * @param String $data Raw message from server
	 * @see registerHandler
	 * @return void
	 */
	function callHandler($event, $data)
	{

		if (isset($this->myEventHandlers[$event]))
		{
			//$function = $this->myEventHandlers[$event] . "(\$data);";
			//eval($function);
			call_user_func($this->myEventHandlers[$event], $data);
		}
		else
		{
			$this->noHandler($data);
		}
	}

	/**
	 * Registers a user handler
	 *
	 * Handler List
	 * SignOn, Config, ERROR, NICK, IMIn, UpdateBuddy, Eviled, Warned, ChatJoin
	 * ChatIn, ChatUpdate, ChatInvite, ChatLeft, GotoURL, DirStatus, AdminNick
	 * AdminPasswd, Pause, Rvous, DimIn, CatchAll
	 *
	 * @access private
	 * @param String $event Event name
	 * @param String $handler User function to call
	 * @see callHandler
	 * @return boolean Returns true if successful
	 */
	function registerHandler($event, $handler)
	{
		if (is_callable($handler))
		{
			$this->myEventHandlers[$event] = $handler;
			return true;
		}
		else
		{
			return false;
		}
	}

    /**
     * No user handler method fall back.
     *
     * Does nothing with message.
     *
     * @access public
     * @param String $message Raw server message
     * @return void
     */
    function noHandler($message)
    {
	    //This function intentionally left blank
	    //This is where the handlers will fall to for now. I plan on including a more
	    //efficent check to avoid the apparent stack jumps that this code will produce
	    //But for now, just fall into here, and be happy
	    return;
    }

    //GLOBAL FUNCTIONS

    /**
     * Finds type, and returns as part of array ['type']
     * Puts message in ['incoming']
     *
     * Helper method for getMessageInfo.
     *
     * @access public
     * @param String $message Raw server message
     * @see msg_parse
     * @see getMessageInfo
     * @return array
     */
    static function msg_type($message)
    {
	    $command = array();
	    @list($cmd, $rest) = explode(":", $message);
	    switch($cmd)
	    {
		    case 'IM_IN2':
			    $type = AIM_TYPE_MSG;
		    break;

		    case 'UPDATE_BUDDY2':
			    $type = AIM_TYPE_UPDATEBUDDY;
		    break;

		    case 'EVILED':
			    $type = AIM_TYPE_WARN;
		    break;

		    case 'SIGN_ON':
			    $type = AIM_TYPE_SIGNON;
		    break;

		    case 'NICK':
			    $type = AIM_TYPE_NICK;
		    break;

		    case 'ERROR':
			    $type = AIM_TYPE_ERROR;
		    break;

		    case 'CHAT_JOIN':
			    $type = AIM_TYPE_CHATJ;
		    break;

		    case 'CHAT_IN':
			    $type = AIM_TYPE_CHATI;
		    break;

		    case 'CHAT_UPDATE_BUDDY':
			    $type = AIM_TYPE_CHATUPDBUD;
		    break;

		    case 'CHAT_INVITE':
			    $type = AIM_TYPE_CHATINV;
		    break;

		    case 'CHAT_LEFT':
			    $type = AIM_TYPE_CHATLE;
		    break;

		    case 'GOTO_URL':
			    $type = AIM_TYPE_URL;
		    break;

		    case 'ADMIN_NICK_STATUS':
			    $type = AIM_TYPE_NICKSTAT;
		    break;

		    case 'ADMIN_PASSWD_STATUS':
			    $type = AIM_TYPE_PASSSTAT;
		    break;

		    case 'RVOUS_PROPOSE':
			    $type = AIM_TYPE_RVOUSP;
		    break;

		    default:
			    $type = AIM_TYPE_NOT_IMPLEMENTED;
		    break;
	    }
	    $command['type'] = $type;
	    $command['incoming'] = $message;
	    return $command;
    }

    /**
     * Parses message and splits into info array
     *
     * Helper method for getMessageInfo.
     *
     * @access public
     * @param String $command Message and type (after msg_type)
     * @see msg_type
     * @see getMessageInfo
     * @return array
     */
    static function msg_parse($command)
    {
	    $info = array();
	    switch($command['type'])
	    {
		    case AIM_TYPE_WARN:
			    $command['incoming'] .= ":0";
			    $it = explode(":", $command['incoming']);
			    $info['warnlevel'] = $it[1];
			    $info['from'] = $it[2];

		    break;

		    case AIM_TYPE_MSG:
			    $it = explode(":", $command['incoming'],5);
			    $info['auto'] = $it[2];
			    $info['from'] = $it[1];
			    $info['message'] = $it[4];
		    break;

		    case AIM_TYPE_UPDATEBUDDY:
			    @list($cmd, $info['sn'], $info['online'], $info['warnlevel'], $info['signon'], $info['idle'], $info['uc']) = explode(":", $command['incoming']);
		    break;

		    case AIM_TYPE_SIGNON:
			    @list($cmd, $info['version']) = explode(":", $command['incoming']);
		    break;

		    case AIM_TYPE_NICK:
			    @list($cmd, $info['nickname']) = explode(":", $command['incoming']);
		    break;
		    case AIM_TYPE_ERROR:
			    @list($cmd, $info['errorcode'], $info['args']) = explode(":", $command['incoming']);
		    break;

		    case AIM_TYPE_CHATJ:
			    @list($cmd, $info['chatid'], $info['chatname']) = explode(":", $command['incoming']);
		    break;

		    case AIM_TYPE_CHATI:
			    @list($cmd, $info['chatid'], $info['user'], $info['whisper'], $info['message']) = explode(":", $command['incoming'],5);
		    break;

		    case AIM_TYPE_CHATUPDBUD:
			    @list($cmd, $info['chatid'], $info['inside'], $info['userlist']) = explode(":", $command['incoming'],3);
		    break;

		    case AIM_TYPE_CHATINV:
			    @list($cmd, $info['chatname'], $info['chatid'], $info['from'], $info['message']) = explode(":", $command['incoming'],5);
		    break;

		    case AIM_TYPE_CHATLE:
			    @list($cmd, $info['chatid']) = explode(":", $command['incoming']);
		    break;

		    case AIM_TYPE_URL:
			    @list($cmd, $info['windowname'], $info['url']) = explode(":", $command['incoming'],3);
		    break;

		    case AIM_TYPE_RVOUSP:
			    @list($cmd,$info['user'],$info['uuid'],$info['cookie'],$info['seq'],$info['rip'],$info['pip'],$info['vip'],$info['port'],$info['tlvs']) = explode(":",$command['incoming'],10);
		    break;

		    case AIM_TYPE_NICKSTAT:
		    case AIM_TYPE_PASSSTAT:
			    @list($cmd, $info['returncode'], $info['opt']) = explode(":", $command['incoming'],3);
		    break;

		    default:
		    $info['command'] = $command['incoming'];
	    }
	    return $info;
    }

    /**
     * Returns a parsed message
     *
     * Calls msg_parse(msg_type( to first determine message type and then parse accordingly
     *
     * @access public
     * @param String $command Raw server message
     * @see msg_type
     * @see msg_parse
     * @return array
     */
    static function getMessageInfo($message)
    {
	    return self::msg_parse(self::msg_type($message));
    }

    /**
     * Checks socket for end of file
     *
     * @access public
     * @param Resource $socket Socket to check
     * @return boolean true if end of file (socket)
     */
    static function socketcheck($socket){
	    $info = stream_get_meta_data($socket);
	    return $info['eof'];
	    //return(feof($socket));
    }
}

?>


code:
<?php

//The following class was created June 30th 2004 by Jeremy(pickle)
//This class is designed to handle a direct connection

class Dconnect
{
	var $sock;
	var $lastReceived;
	var $lastMessage;
	var $connected;
	var $cookie;
	var $type=2;
	var $connectedTo;

	function Dconnect($ip,$port)
	{
		if(!$this->connect($ip,$port))
		{
			sEcho("Connection failed constructor");
			$this->connected=false;
		}
		else
			$this->connected=true;

		$this->lastMessage="";
		$this->lastReceived="";
	}

	function readDIM()
	{
		/*
			if(!$this->stuffToRead())
			{
				sEcho("Nothing to read");
				$this->lastMessage=$this->lastReceived="";
				return false;
			}
		*/
		$head=fread($this->sock,6);
		if(strlen($head)<=0)
		{
			sEcho("The direct connection has been closed");
			return false;
		}
		$minihead=unpack("a4ver/nsize",$head);
		if($minihead['size'] <=0)
		  return;
		$headerinfo=unpack("nchan/nsix/nzero/a6cookie/Npt1/Npt2/npt3/Nlen/Npt/npt0/ntype/Nzerom/a*sn",fread($this->sock,($minihead['size']-6)));
		$allheader=array_merge($minihead,$headerinfo);
		sEcho($allheader);
		if($allheader['len']>0 && $allheader['len'] <= MAX_DIM_SIZE)
		{
			$left=$allheader['len'];
			$stuff="";
			$nonin=0;
			while(strlen($stuff) < $allheader['len'] && $nonin<3)
			{
				$stuffg=fread($this->sock,$left);
				if(strlen($stuffg)<0)
				{
					$nonin++;
					continue;
				}
				$left=$left - strlen($stuffg);
				$stuff.=$stuffg;
			}
			$data=unpack("a*decoded",$stuff);
		}

		else if($allheader['len'] > MAX_DIM_SIZE)
		{
			$data['decoded']="too big";
		}

		else
			$data['decoded']="";
		$all=array_merge($allheader,$data);

		$this->lastReceived=$all;
		$this->lastMessage=$all['decoded'];

		//$function=$this->DimInf . "(\$all);";
		//eval($function);

		return $all;
	}

	function sendMessage($message,$sn)
	{
		//Make the "mini header"
		$minihead=pack("a4n","ODC2",76);
		$header=pack("nnna6NNnNNnnNa*",1,6,0,$this->cookie,0,0,0,strlen($message),0,0,96,0,$sn);
		$bighead=$minihead . $header;
		while(strlen($bighead)<76)
			$bighead.=pack("c",0);

		$tosend=$bighead . pack("a*",$message);
		$w=array($this->sock);
		stream_select($r=NULL,$w,$e=NULL,NULL);
		//Now send it all
		fputs($this->sock,$tosend,strlen($tosend));
	}
	function stuffToRead()
	{
		//$info=stream_get_meta_data($this->sock);
		//sEcho($info);
		$s=array($this->sock);
		$changed=stream_select($s,$fds=NULL,$m=NULL,0,20000);
		return ($changed>0);
	}

	function close()
	{
		$this->connected=false;
		return fclose($this->sock);
	}

	function connect($ip,$port)
	{
		$this->sock=fsockopen($ip,$port,$en,$es,3);
		if(!$this->sock)
		{  sEcho("Connection failed");
			$this->sock=null;
			return false;
		}
		return true;
	}
}

class FileSendConnect
{
	var $sock;
	var $lastReceived;
	var $lastMessage;
	var $connected;
	var $cookie;
	var $tpye=3;

	function FileSendConnect($ip,$port)
	{
		if(!$this->connect($ip,$port))
		{
			sEcho("Connection failed constructor");
			$this->connected=false;
		}
		else
			$this->connected=true;

		$this->lastMessage="";
		$this->lastReceived="";
	}

	function readDIM()
	{

			if(!$this->stuffToRead())
			{
				sEcho("Nothing to read");
				$this->lastMessage=$this->lastReceived="";
				return;
			}

		$minihead=unpack("a4ver/nsize",fread($this->sock,6));
		if($minihead['size'] <=0)
		  return;
		$headerinfo=unpack("nchan/nsix/nzero/a6cookie/Npt1/Npt2/npt3/Nlen/Npt/npt0/ntype/Nzerom/a*sn",fread($this->sock,($minihead['size']-6)));
		$allheader=array_merge($minihead,$headerinfo);
		sEcho($allheader);
		if($allheader['len']>0)
			$data=unpack("a*decoded",fread($this->sock,$allheader['len']));
		else
			$data['decoded']="";
		$all=array_merge($allheader,$data);

		$this->lastReceived=$all;
		$this->lastMessage=$all['decoded'];

		//$function=$this->DimInf . "(\$all);";
		//eval($function);

		return $all;
	}

	function sendMessage($message,$sn)
	{
		//Make the "mini header"
		$minihead=pack("a4n","ODC2",76);
		$header=pack("nnna6NNnNNnnNa*",1,6,0,$this->cookie,0,0,0,strlen($message),0,0,96,0,$sn);
		$bighead=$minihead . $header;
		while(strlen($bighead)<76)
			$bighead.=pack("c",0);

		$tosend=$bighead . pack("a*",$message);

		//Now send it all
		fwrite($this->sock,$tosend,strlen($tosend));
	}
	function stuffToRead()
	{
		//$info=stream_get_meta_data($this->sock);
		//sEcho($info);
		$s=array($this->sock);
		$changed=stream_select($s,$fds=NULL,$m=NULL,1);
		return ($changed>0);
	}

	function close()
	{
		$this->connected=false;
		fclose($this->sock);
		unset($this->sock);
		return true;
	}

	function connect($ip,$port)
	{
		$this->sock=fsockopen($ip,$port,$en,$es,3);
		if(!$this->sock)
		{  sEcho("Connection failed to" . $ip . ":" . $port);
			$this->sock=null;
			return false;
		}
		return true;
	}
}


code:
<?php
/*
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2008, 2009, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }

/**
 * AIM background connection manager for AIM-using queue handlers,
 * allowing them to send outgoing messages on the right connection.
 *
 * Input is handled during socket select loop, keepalive pings during idle.
 * Any incoming messages will be handled.
 *
 * In a multi-site queuedaemon.php run, one connection will be instantiated
 * for each site being handled by the current process that has XMPP enabled.
 */
class AimManager extends ImManager
{
    public $conn = null;
    /**
     * Initialize connection to server.
     * @return boolean true on success
     */
    public function start($master)
    {
        if(parent::start($master))
        {
            $this->connect();
            return true;
        }else{
            return false;
        }
    }

    public function getSockets()
    {
        $this->connect();
        if($this->conn){
            return array($this->conn->myConnection);
        }else{
            return array();
        }
    }

    /**
     * Process AIM events that have come in over the wire.
     * @param resource $socket
     */
    public function handleInput($socket)
    {
        common_log(LOG_DEBUG, "Servicing the AIM queue.");
        $this->stats('aim_process');
        $this->conn->receive();
    }

    function connect()
    {
        if (!$this->conn) {
            $this->conn=new Aim($this->plugin->user,$this->plugin->password,4);
            $this->conn->registerHandler("IMIn",array($this,"handle_aim_message"));
            $this->conn->myServer="toc.oscar.aol.com";
            $this->conn->signon();
            // @todo i18n FIXME: Update translator documentation, please.
            // TRANS: No idea what the use case for this message is.
            $this->conn->setProfile(_m('Send me a message to post a notice'),false);
        }
        return $this->conn;
    }

    function handle_aim_message($data)
    {
        $this->plugin->enqueueIncomingRaw($data);
        return true;
    }

    function send_raw_message($data)
    {
        $this->connect();
        if (!$this->conn) {
            return false;
        }
        $this->conn->sflapSend($data[0],$data[1],$data[2],$data[3]);
        return true;
    }
}


code:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#. TRANS: No idea what the use case for this message is.
#: aimmanager.php:80
msgid "Send me a message to post a notice"
msgstr ""

#. TRANS: Display name.
#: AimPlugin.php:60
msgid "AIM"
msgstr ""

#. TRANS: Exception thrown in AIM plugin when user has not been specified.
#: AimPlugin.php:149
msgid "Must specify a user."
msgstr ""

#. TRANS: Exception thrown in AIM plugin when password has not been specified.
#: AimPlugin.php:153
msgid "Must specify a password."
msgstr ""

#. TRANS: Plugin description.
#: AimPlugin.php:168
msgid ""
"The AIM plugin allows users to send and receive notices over the AIM network."
msgstr ""