# Image Uploader scripting API

## Создание плагинов

Для расширенной поддержки серверов в программе используются скрипты на языке Squirrel 2.

Документация языка Squirrel
Документация стандартной библиотеки языка Squirrel

Они должны быть сохранены в кодировке utf-8 в файлах с расширением `.nut`.

Пример плагина (example.nut):

    test <- "example"; // global variable

    /**
    * Функция, загружающая файл
    * @var string pathToFile
    * @var CIUUploadParams options
    * @return int - success(1), failure(0)
    **/
    function  UploadFile(pathToFile, options)
    {
        nm.setUrl("http://example.com/upload.php");
        nm.addQueryParamFile("file", pathToFile, ExtractFileName(pathToFile),"");
        nm.addQueryParam("submit", "Upload file!");
        nm.doUploadMultipartData();

        local response = nm.responseBody(); // 'local' it's like javascript's 'var' but only for local variables
        local directUrl = regex_simple(response, "\\[IMG\\](.+)\\[/IMG\\]",0);

        options.setDirectUrl(directUrl);

        return 1; //успех
    }

    /**
    * Вспомогательная функция, упрощающая работу с регулярными выражениями
    * @var string data - строка, в которой мы ищем
    * @var string regStr - регулярное выражение, в формате, поддерживаемом стандартной библиотекой языка squirrel.
    *      http://www.squirrel-lang.org/doc/sqstdlib2.html#d0e2580
    *      Этот формат не поддерживает некоторые возможности формата PCRE, используемого в servers.xml.
    * @var int start - с какой позиции в строке начинать поиск)
    * @return string - возвращает текст, захваченный первой подмаской (subpattern).
    **/
    function regex_simple(data,regStr,start)
    {
        local ex = regexp(regStr);
        local res = ex.capture(data, start);
        local resultStr = "";
        if(res != null){
            resultStr = data.slice(res[1].begin, res[1].end);
        }
        return resultStr;
    }

    /**
    * Необязательные функции:
    * Получение списка альбомов(папок, галерей) на сервере
    * @var CFolderList list
    * @return int - success(1), failure(0)
    **/
    function GetFolderList(list)
    {
        // Ваш код
        return 1; //успех
    }

    /**
    * Create an folder or an album
    * @var CFolderItem parentAlbum
    * @var CFolderItem album
    * @return int - success(1), failure(0)
    **/
    function CreateFolder(parentAlbum,album)
    {
        // Ваш код
        return 1; //успех
    }

    /** Modify a folder or an album (update name, description)
    * @var CFolderItem album
    * @return int - success(1), failure(0)
    **/
    function ModifyFolder(album)
    {
        // Ваш код
        return 1; //успех
    }

    // Функция, возвращающая список видов ограничений доступа к альбому:
    // приватный, общедоступный, только для друзей и т.п.
    // @return array
    function GetFolderAccessTypeList()
    {
        return ["ТипДоступа1", "ТипДоступа2"];
    }

В общем случае необходимо реализовать 1 функцию — `UploadFile`.
Если нужна поддержка серверных альбомов, то необходимо реализовать еще 4 функции — `GetFolderList`, `CreateFolder`, `ModifyFolder`, `GetFolderAccessTypeList`.