Так это выходит только для твоего сервера, или везде так?anonim писал(а): Запрос на активацию новой учетной записи
ID: 1082
Блок данных: текст(имя) + текст(IP-адрес) + текст(сообщение модератору) + текст(32 символьный MD5 хэш-код пароля)
Смотри внимательнее. Вот юзай полную документацию по плагину под сервер Chudika
Архив: Технология создания плагинов
Re: Технология создания плагинов
- 
				Maxim Mirgorodsky
- Администратор
- Сообщения: 6897
- Зарегистрирован: 09:56, 27.06.2005
Re: Технология создания плагинов
Официально возможность получения пароля при отправке заявки на активацию появится в следующей версии сервера.
Пользователям Chudik/anonim версию с этой возможностью выслали раньше.
			
			
									
						
										
						Пользователям Chudik/anonim версию с этой возможностью выслали раньше.
Re: Технология создания плагинов
Вот это и иентересовало, ZigZagkms, могу только пока предложить вариант, одобрять, а при входе данного пользователя уже проверять этот пароль, и тогда банить или удалять пользователя.Maxim Mirgorodsky писал(а):Официально возможность получения пароля при отправке заявки на активацию появится в следующей версии сервера.
Пользователям Chudik/anonim версию с этой возможностью выслали раньше.
Re: Технология создания плагинов
Maxim, а возможноли добавить возможность плагинам (организовать соответствующие запросы от плагинов к серверу или клиенту) по управлению правами пользователей?
			
			
									
						
										
						- 
				Maxim Mirgorodsky
- Администратор
- Сообщения: 6897
- Зарегистрирован: 09:56, 27.06.2005
Re: Технология создания плагинов
Пока плагины правами управлять не могут. В будущем возможно реализуем.
			
			
									
						
										
						- 
				ZigZagkms
- Сообщения: 109
- Зарегистрирован: 08:23, 11.12.2008
- Откуда: Комсомольск-на-Амуре
- Контактная информация:
Re: Технология создания плагинов
Скажите пожалуйста работает ли инициирование события
Что то у меня не хотит... Может ли на это повлиять то, что не активирован сервер (триал версия)?
			
			
									
						
							Код: Выделить всё
Удалить учетную запись с сервера  
ID: 1071
Блок данных: текст(имя виртуального пользователя) + текст(имя удаляемого пользователя)
Остановить плагинЗабросил, всем спасибо, исходники раздаю кому надо https://github.com/ZigZagkms
			
						- 
				KGB
- Сообщения: 659
- Зарегистрирован: 08:54, 13.07.2010
- Откуда: Чебоксары, Россия
- Контактная информация:
Re: Технология создания плагинов
http://commfort.com/ru/forum/viewtopic. ... 931#p47931 - обещали исправить... Добавлю еще, что у меня не работает и смена пароля (1070).ZigZagkms писал(а):Скажите пожалуйста работает ли инициирование события
Удалить учетную запись с сервера
- 
				ZigZagkms
- Сообщения: 109
- Зарегистрирован: 08:23, 11.12.2008
- Откуда: Комсомольск-на-Амуре
- Контактная информация:
Re: Технология создания плагинов
Неужели и этот тоже не работает?
Что за неудачи, почти все что нужно не работает =(
Выпускайте поскорее сервер исправленный, пожалуйста =(
			
			
									
						
							Код: Выделить всё
Удалить заявку на активацию учетной записи  
ID: 1035
Блок данных: текст(имя виртуального пользователя) + текст(имя отправившего заявку пользователя)Выпускайте поскорее сервер исправленный, пожалуйста =(
Забросил, всем спасибо, исходники раздаю кому надо https://github.com/ZigZagkms
			
						- 
				Maxim Mirgorodsky
- Администратор
- Сообщения: 6897
- Зарегистрирован: 09:56, 27.06.2005
Re: Технология создания плагинов
Да, эта же ошибка с функцией изменения пароля. Новый сервер будет в марте.
			
			
									
						
										
						- 
				ZigZagkms
- Сообщения: 109
- Зарегистрирован: 08:23, 11.12.2008
- Откуда: Комсомольск-на-Амуре
- Контактная информация:
Re: Технология создания плагинов
И разбейте пожалуйста тему "Технология создания плагинов" например на 
"Ошибки при разработке плагинов" - где будут публиковаться ошибки
"Пожелания по системе плагинов" - что добавить хотелось бы
"Технология разработки плагинов" - обсуждение, вопросы и помощь
А то невозможно тут ориентироваться! Постоянно по несколько раз публикуют найденные ошибки, и одни и те же пожелания
			
			
									
						
							"Ошибки при разработке плагинов" - где будут публиковаться ошибки
"Пожелания по системе плагинов" - что добавить хотелось бы
"Технология разработки плагинов" - обсуждение, вопросы и помощь
А то невозможно тут ориентироваться! Постоянно по несколько раз публикуют найденные ошибки, и одни и те же пожелания
Забросил, всем спасибо, исходники раздаю кому надо https://github.com/ZigZagkms
			
						- 
				ZigZagkms
- Сообщения: 109
- Зарегистрирован: 08:23, 11.12.2008
- Откуда: Комсомольск-на-Амуре
- Контактная информация:
Re: Технология создания плагинов
Скажите пожалуйста, данное ID удаляет из списка УЖЕ отклоненных\активированных или нет?
И если нет скажите как с этого списка удалить? Например отклонили регистрацию и через 5 минут хотим удалить, чтобы пользователь снова мог подать авторизацию
			
			
									
						
							Код: Выделить всё
Удалить заявку на активацию учетной записи  
ID: 1035
Блок данных: текст(имя виртуального пользователя) + текст(имя отправившего заявку пользователя)Забросил, всем спасибо, исходники раздаю кому надо https://github.com/ZigZagkms
			
						Re: Технология создания плагинов
Насколько помю это удалить запрос на активацию. Чесно говоря насчёт некоторых ошибок с удалением учёт из списка проверенных у тебя не должно работать т.к насколько помню только в пропаченом сервере появилась возможно, по моему запросу.ZigZagkms писал(а):Скажите пожалуйста, данное ID удаляет из списка УЖЕ отклоненных\активированных или нет?
И если нет скажите как с этого списка удалить? Например отклонили регистрацию и через 5 минут хотим удалить, чтобы пользователь снова мог подать авторизациюКод: Выделить всё
Удалить заявку на активацию учетной записи ID: 1035 Блок данных: текст(имя виртуального пользователя) + текст(имя отправившего заявку пользователя)
Re: Технология создания плагинов
Попытался попробовать плагин на MSVC, заработало всё кроме инициирования события, код:
Ошибка: 
[10.02.2011 13:03:49] Ошибка при обработке программой сообщения от плагина "commfort_null.cfplug" c ID=50. Плагин остановлен.
Сообщение из лога, текст из std::string send.c_str(): [12:52:24] send: 8unix-net04text
Что я делаю не так?
			
			
									
						
										
						Код: Выделить всё
//---------------------------------------------------------------------------
#include <windows.h>
#include <string>
#include <time.h>
#include <iostream> 
#include <sstream>
#pragma hdrstop
void logprintf(char * format, ...)
{
	if(true)
	{
		char tmp_buf[512];
		va_list args;
		FILE* file;
		
		va_start(args, format);
		vsprintf(tmp_buf, format, args);
		va_end(args);
		puts(tmp_buf);
		file = fopen("plugin.log", "a");
		if(true)
		{
			time_t rawtime;
			struct tm * timeinfo;
			char sztime[80];
			//char *result = NULL;
			time(&rawtime);
			timeinfo = localtime(&rawtime);
			strftime(sztime, 80, "%H:%M:%S", timeinfo);
			//result = strtok(tmp_buf, "\n");
			fprintf(file, "[%s] %s\n", sztime, tmp_buf);
		}
		else
		{
			fprintf(file, "%s\n", tmp_buf);
		}
		fclose(file);
	}
}
#include "UTF8.h"
DWORD dwPluginID;
typedef VOID (__stdcall *typeCommFortProcess)(DWORD dwPluginID, DWORD dID, BYTE * bOutBuffer, DWORD dwOutBufferSize);
typedef DWORD (__stdcall *typeCommFortGetData)(DWORD dwPluginID, DWORD dwID, BYTE * bInBuffer, DWORD dwInBufferSize, BYTE * bOutBuffer, DWORD dwOutBufferSize);
typeCommFortProcess CommFortProcess;
typeCommFortGetData CommFortGetData;
extern "C" __declspec(dllexport) BOOL PluginStart(DWORD dwThisPluginID, typeCommFortProcess, typeCommFortGetData);
extern "C" __declspec(dllexport) VOID PluginStop();
extern "C" __declspec(dllexport) VOID PluginProcess(DWORD dwID, BYTE * bInBuffer, DWORD dwInBufferSize);
extern "C" __declspec(dllexport) DWORD PluginGetData(DWORD dwID, BYTE * bInBuffer, DWORD dwInBufferSize, BYTE * bOutBuffer, DWORD dwOutBufferSize);
extern "C" __declspec(dllexport) BOOL PluginPremoderation(DWORD dwID, wchar_t * wText, DWORD *dwTextLength);
extern "C" __declspec(dllexport) VOID PluginShowOptions();
extern "C" __declspec(dllexport) VOID PluginShowAbout();
//---------------------------------------------------------------------------
int WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	int iOffset, i2;
	memcpy(&iOffset,&i2,4);
	logprintf("DllMain");
	return 1;
}
std::string fTextToAnsiString(std::wstring uText) //вспомогательная функция для упрощения работы с данными
{
	//функция предназначена для ознакомительных целей,
	//не рекомендуется для реального применения,
	//так как при ее использовании проявляется избыточное копирование данных
	std::string ret;
	std::stringstream ss;
	ss << uText.length();
	ss << utf8_wcstombs(uText);
	ss >> ret;
	return ret;
}
//---------------------------------------------------------------------------
std::string fIntegerToAnsiString(int iValue) //вспомогательная функция для упрощения работы с данными
{
	std::string aReturn;
	std::stringstream ss;
	ss << iValue;
	ss >> aReturn;
	return aReturn;
}
BYTE * fAnsiStringToByte(const char * szText)
{
	BYTE * out = new BYTE[strlen(szText)];
	for(int i = 0; i <= strlen(szText); i++)
	{
		out[i] = szText[i];
	}
	out[strlen(szText)] = '\0';
	return out;
}
//---------------------------------------------------------------------------
int fReadInteger(BYTE * bInBuffer, int * iOffset) //вспомогательная функция для упрощения работы с чтением данных
{
	int iLength;
	memcpy(&iLength, bInBuffer + (*iOffset),4);
	(*iOffset)+=4;
	return iLength;
}
//---------------------------------------------------------------------------
std::wstring fReadText(BYTE * bInBuffer, int * iOffset) //вспомогательная функция для упрощения работы с чтением данных
{
	int iLength;
	memcpy(&iLength, bInBuffer + (*iOffset),4);
	(*iOffset)+=4;
	wchar_t * uRet = new wchar_t[iLength+1];
	for(int i = 0; i < iLength; i++)
	{
		memcpy(&uRet[i],  bInBuffer + (*iOffset)+(i*2), 2);
	}
	(*iOffset)+=iLength*2;
	uRet[iLength] = '\0';
	std::wstring str = uRet;
	std::string s = utf8_wcstombs(str);
	return str;
}
//---------------------------------------------------------------------------
void fWriteInteger(BYTE * bOutBuffer, int iOffset, int iValue) //вспомогательная функция для упрощения работы с записью данных
{
	memcpy(bOutBuffer + iOffset, &iValue, 4);
	iOffset+=4;
}
//---------------------------------------------------------------------------
void fWriteText(BYTE * bOutBuffer, int * iOffset, std::wstring uValue) //вспомогательная функция для упрощения работы с записью данных
{
	int iLength = uValue.length();
	memcpy(bOutBuffer + (*iOffset),&iLength,4);
	(*iOffset)+=4;
	memcpy(bOutBuffer + (*iOffset),uValue.c_str(),iLength*2);
	(*iOffset)+=iLength*2;
}
//---------------------------------------------------------------------------
BOOL PluginStart(DWORD dwThisPluginID, typeCommFortProcess func1, typeCommFortGetData func2)
{
	dwPluginID = dwThisPluginID;
	//При инициализации планину присваивается уникальный идентификатор
	//его необходимо обязательно сохранить, и указывать
	//в качестве первого параметра при инициировании событий
	CommFortProcess = func1;
        //указываем функцию обратного вызова,
	//с помощью которой плагин сможет инициировать события
	CommFortGetData = func2;
        //указываем функцию обратного вызова,
	//с помощью которой можно будет запрашивать необходимые данные от программы
	//Пример получения данных от программы (получение типа программы):
	int iSize = (*CommFortGetData)(dwPluginID, 2000, NULL, NULL, NULL, NULL); //получаем объем буфера
	BYTE * cData = new BYTE[iSize];
	(*CommFortGetData)(dwPluginID, 2000,cData,iSize, NULL, NULL);//заполняем буфер
	int iProgramType;
	memcpy(&iProgramType,cData,4);//копируем число
	if(iProgramType==0)
	logprintf("Плагин успешно запущен на сервере CommFort");
	else if(iProgramType==1)
	logprintf("Плагин успешно запущен на клиенте CommFort");
	logprintf("Plugin started.");
	//Возвращаемые значения:
	//TRUE - запуск прошел успешно
	//FALSE - запуск невозможен
	return TRUE;
}
//---------------------------------------------------------------------------
VOID PluginStop()
{
	logprintf("Plugin stopped.");
	//данная функция вызывается при завершении работы плагина
}
//---------------------------------------------------------------------------
VOID PluginProcess(DWORD dwID, BYTE * bInBuffer, DWORD dwInBufferSize)
{
	logprintf("PluginProcess: [%d] [%s] [%d]", dwID, bInBuffer, dwInBufferSize);
	//Функция приема событий
	//Параметры:
	//dwID - идентификатор события
	//bInBuffer - указатель на данные
	//dwInBufferSize - объем данных в байтах
	int iReadOffset = 0;
	if(dwID==5) //личное сообщение
	{
		std::wstring userName = fReadText(bInBuffer, &iReadOffset);
		std::wstring ip = fReadText(bInBuffer, &iReadOffset);
		int userType = fReadInteger(bInBuffer, &iReadOffset);
		std::wstring chanName = fReadText(bInBuffer, &iReadOffset);
		int type = fReadInteger(bInBuffer, &iReadOffset);
		std::wstring text = fReadText(bInBuffer, &iReadOffset);
		std::string send = fTextToAnsiString(L"unix-net") + fIntegerToAnsiString(0) + fTextToAnsiString(text);
		logprintf("send: %s", fAnsiStringToByte(send.c_str()), sizeof(BYTE));
		(*CommFortProcess)(dwPluginID,50,fAnsiStringToByte(send.c_str()),send.length());
	}
}
//---------------------------------------------------------------------------
DWORD PluginGetData(DWORD dwID, BYTE * bInBuffer, DWORD dwInBufferSize, BYTE * bOutBuffer, DWORD dwOutBufferSize)
{
        //функция передачи данных программе
	int iReadOffset = 0; //вспомогательные переменные для упрощения работы с блоком данных
	int iWriteOffset = 0;
	//при значении dwOutBufferSize равным нулю функция должна вернуть объем данных, ничего не записывая
	if(dwID==2800) //предназначение плагина
	{
		if(dwOutBufferSize==0)
		return 4; //объем памяти в байтах, которую необходимо выделить программе
		fWriteInteger(bOutBuffer,iWriteOffset,0);  //плагин подходит как для клиента, так и для сервера
		return 4;//объем заполненного буфера в байтах
	}
	else if(dwID==2810) //название плагина (отображается в списке)
	{
		std::wstring uName(L"NULL: тест");//название плагина
		int iSize = uName.length()*2+4;
		if(dwOutBufferSize==0)
		return iSize; //объем памяти в байтах, которую необходимо выделить программе
		fWriteText(bOutBuffer, &iWriteOffset, uName);
		return iSize;//объем заполненного буфера в байтах
	}
	return 0;//возвращаемое значение - объем записанных данных
}
//---------------------------------------------------------------------------
VOID PluginShowOptions()
{
	//данная функция вызывается при нажатии кнопки "Настроить" в списке плагинов
	//если Вы не желаете чтобы активировалась кнопка "Настроить", просто сотрите данную функцию
//	ShowMessage(L"Options dialog");
}
//---------------------------------------------------------------------------
VOID PluginShowAbout()
{
	//данная функция вызывается при нажатии кнопки "О плагине" в списке плагинов
	//если Вы не желаете чтобы активировалась кнопка "Настроить", просто сотрите данную функцию
//	ShowMessage(L"Test plugin for CommFort 5\n\nCreated by CommFort software Ltd.");
}
//---------------------------------------------------------------------------
[10.02.2011 13:03:49] Ошибка при обработке программой сообщения от плагина "commfort_null.cfplug" c ID=50. Плагин остановлен.
Сообщение из лога, текст из std::string send.c_str(): [12:52:24] send: 8unix-net04text
Что я делаю не так?
- 
				Maxim Mirgorodsky
- Администратор
- Сообщения: 6897
- Зарегистрирован: 09:56, 27.06.2005
Re: Технология создания плагинов
Удаляет как обработанную, так и не обработанную запись. Но это событие появится в сервере следующей версии.ZigZagkms писал(а):Скажите пожалуйста, данное ID удаляет из списка УЖЕ отклоненных\активированных или нет?
И если нет скажите как с этого списка удалить? Например отклонили регистрацию и через 5 минут хотим удалить, чтобы пользователь снова мог подать авторизациюКод: Выделить всё
Удалить заявку на активацию учетной записи ID: 1035 Блок данных: текст(имя виртуального пользователя) + текст(имя отправившего заявку пользователя)
Спасибо за пожелание, в ближайшее время разобьем.И разбейте пожалуйста тему "Технология создания плагинов" например на
"Ошибки при разработке плагинов" - где будут публиковаться ошибки
"Пожелания по системе плагинов" - что добавить хотелось бы
"Технология разработки плагинов" - обсуждение, вопросы и помощь
- 
				Maxim Mirgorodsky
- Администратор
- Сообщения: 6897
- Зарегистрирован: 09:56, 27.06.2005
Re: Технология создания плагинов
adamix
ss << utf8_wcstombs(uText);
Текст должен быть в формате UTF16, на каждый символ по 2 байта.
			
			
									
						
										
						Возможно, проблема в этом:std::string fTextToAnsiString(std::wstring uText) //вспомогательная функция для упрощения работы с данными
{
//функция предназначена для ознакомительных целей,
//не рекомендуется для реального применения,
//так как при ее использовании проявляется избыточное копирование данных
std::string ret;
std::stringstream ss;
ss << uText.length();
ss << utf8_wcstombs(uText);
ss >> ret;
return ret;
}
ss << utf8_wcstombs(uText);
Текст должен быть в формате UTF16, на каждый символ по 2 байта.
