Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
Алексей Пикуров
UPD (18.01.2021)
Скрипт устарел, свежая версия для версии MyChat 8.4.0 и старше.

Итак, уже практически готова версия 4.10.4, в ней добавлена немаленькая пачка :D новых функций для скриптового движка и я хочу показать скрипт, который сможет поздравлять ваших пользователей с днями рождений. Автоматически.

Понятное дело, что для того, чтобы всё было правильно и красиво, ваши пользователи должны указывать день своего рождения в профиле, иначе грош цена будет этому скрипту:
birthday.png
День рождения в профиле пользователя MyChat

Далее, открываем сервер, инструмент "Скрипты", и вставляем скрипт на событие, которое будет выполняться каждый час:
scriptbirthdayreminder.png
Вставка скрипта-поздравлялки с днями рождений в редактор скриптов MyChat Server

Не забываем включить скрипт.

Более подробно о скрипте и о том, как он работает, будет отдельная статья в разделе "Статьи" на нашем сайте, а пока исходный текст скрипта:
Код: Выделить всё
//////////////////////////////////////////////////////////////
//                                                          //
// MyChat Server Script Language                            //
//                                                          //
// Скрипт автоматических поздравлений с днями рождений      //
// версия 1.0 от 02.10.2011                                 //
//                                                          //
// Copyright(c) Alexey Pikurov / Network Software Solutions //
// hobit@nsoft-s.com                                        //
// http://www.nsoft-s.com                                   //
//                                                          //
// Выполнять каждый час                                     //
// Вопросы, пожелания, комментарии:                         //
// http://www.nsoft-s.com/forum/viewforum.php?f=35          //
//                                                          //
//////////////////////////////////////////////////////////////
var
  s, sUserFullName, sMsg, s2, sToday, sOld: string;
  iUIN, iSex: integer;
  sJSON: string;
begin
  sToday := FormatDateTime('ddmmyyyy', Now); // получаем текущую дату

  // читаем из реестра запись о прошлом запуске
  RegGetString(HKEY_CURRENT_USER, 'Software\MyChatServerScripts\BirthdayReminder', sOld);

    // если мы ужа работали сегодня, то ничего не делаем, чтобч
    // не поздравить одних и тех же людей по второму кругу
    if sToday<>sOld then begin
      // записываем в реестр текущую дату
      RegSetString(HKEY_CURRENT_USER, 'Software\MyChatServerScripts\BirthdayReminder', sToday);
     
      // получаем список UIN-ов людей, у которых сегодня день рождения
      s := mGetBirthdayUsers(Now);
                                 
          // и перебираем их всех по одному
          while length(s)>0 do begin
            iUIN := strtoint(GetNextSt(s, ','));

            sJSON := mGetUserDataAsJSON(iUIN, 'Sex');
            JSONGetInteger(sJSON, 'Sex', iSex); // получение пола пользователя

            sUserFullName := mGetUserFullNameByPreset(iUIN, 0); // ... и полного имени
             
              case iSex of
                0, 1: s2 := 'его';
                2: s2 := 'её';
              end;
       
            // формируем строку для поздравления
            sMsg := 'Сегодня ' + sUserFullName + ' празднует день рождения!' +
                    CRLF +
                    'Подравляем ' + s2 + ' с этим праздником и желаем всего самого ' +
                    'светлого и доброго!';
             
            // ...и размещаем её на доске объяалений, чтобы было видно всем пользователям,
            // а дату окончания объявления выставляем до конца текущего дня   
            mAddNewBBSMessage(false, sMsg, EndOfTheDay(Now));
          end;
    end;     
end.

Как видите, всё достаточно просто и линейно. Комментарии дополнительно поясняют алгоритм скрипта.

А вот и результат работы на доске объявлений у клиентов:
bbsbirthdays.png
Доска объявлений у клиентов чата MyChat с текстом поздравлений с днями рождений
Volldemar
Hobit писал(а):Далее, открываем сервер, инструмент "Скрипты", и вставляем скрипт на событие, которое будет выполняться каждый час:

А в чем тайный смысл запуска данного скрипта каждый час? Не получится ли, что поздравления буду каждый час, в течении рабочего дня? не многовато ли? ;)
Аватара пользователя
Алексей Пикуров
Если вы прочитаете исходник скрипта, то увидите, что там есть контроль на выполнение - раз в сутки. Почему каждый час - потому что неизвестно, в какое время суток будет запущен сервер. Время сервера считается по его аптайму, а не по системным часам. Соответственно, если сервер запустили, скажем, в 20:00, сутки "натикают" в 20:00 следующего дня. Кого в это время уже поздравлять? Рабочий день окончен. Поэтому схема запуска скрипта "раз в сутки" не подходит.

Читайте исходник - там всё элементарно. И есть комментарии :)
Volldemar
Скопипастил текст скрипта -поздравлялки, но на сервере, в редакторе скриптов, русские буквицы отображаются крякозяблами. Какую кодировку воспринимает редактор скриптов сервера?
Аватара пользователя
Андрей Раков
Воспринимается кодировка win1251.

Рекомендую сохранить текст скрипта в блокноте на сервере и скопировать уже оттуда в редактор скриптов.
Volldemar
И так тоже делал...
Вложения
обмена01.jpg
Аватара пользователя
Андрей Раков
Может у вас на сервере языковые настройки неправильные? Виндовс английская?
Volldemar
Gifer писал(а):Может у вас на сервере языковые настройки неправильные? Виндовс английская?


Свойства операционной системы
Название ОС Microsoft Windows 7 Ultimate
Язык ОС Русский (Россия)
Тип ядра ОС Multiprocessor Free (32-bit)
Версия ОС 6.1.7601
Пакет обновления ОС Service Pack 1
Дата инсталляции ОС 31.08.2011
Корневая папка ОС C:\Windows

Версии компонентов
Common Controls 6.16
Internet Explorer 9.0.8112.16421
Windows Mail 6.1.7600.16385 (win7_rtm.090713-1255)
Windows Media Player 12.0.7600.16385 (win7_rtm.090713-1255)
Windows Messenger -
MSN Messenger -
Internet Information Services (IIS) -
.NET Framework 3.5.30729.4926 built by: NetFXw7
Novell Client -
DirectX DirectX 11.0
OpenGL 6.1.7600.16385 (win7_rtm.090713-1255)
Аватара пользователя
Алексей Пикуров
Попробуйте вот это: http://novikovmaxim.livejournal.com/135472.html
Аватара пользователя
Алексей Пикуров
Да, 100% дело в настройках локали системной. Если русские буквы показываются закорючками, значит система не может правильно их отобразить из-за неверной настройки локали.
Volldemar
Вот скрины, что у меня не так?
Вложения
3.jpg
3.jpg (23.33 КБ) Просмотров: 22210
2.jpg
2.jpg (14.07 КБ) Просмотров: 22210
1.jpg
1.jpg (24.09 КБ) Просмотров: 22210
Volldemar
ещё один скрин
Вложения
4.jpg
4.jpg (22.97 КБ) Просмотров: 22209
Volldemar
Проявился не приятный баг, поздравлялки, жаль :(
Значит так, при присоединении по веб-чату, сервер воспринимает дату подключения, как дату рождения, ну и ессно, поздравляет: "Сегодня WEB12102011_115237 празднует день рождения!
Подравляем его с этим праздником и желаем всего самого светлого и доброго!". Нада бы, как то решить такую неприятность...
Аватара пользователя
Андрей Раков
Да, поздравление новорожденным :) исключим зарегистрированных через веб юзеров из поздравлений.
Volldemar
Gifer писал(а):Да, поздравление новорожденным :) исключим зарегистрированных через веб юзеров из поздравлений.

Может для начала вести проверку в скрипте? К примеру на количество лет? ;) Скажем если меньше 10, но не поздравлять :)
Аватара пользователя
Алексей Пикуров
:) Веб-юзерам будем проставлять 1900-й год и таких "аксакалов" поздравлять не будем в принципе. Надо же как-то отличать таких товарищей.
Volldemar
Hobit писал(а)::) Веб-юзерам будем проставлять 1900-й год и таких "аксакалов" поздравлять не будем в принципе. Надо же как-то отличать таких товарищей.

Ну это на будущее, а как сейчас быть?
Аватара пользователя
Алексей Пикуров
Надо скрипт подправить, я сегодня что-то придумаю.
Volldemar
Hobit писал(а):Надо скрипт подправить, я сегодня что-то придумаю.

Ждёмс подправленный скрипт ;) очень - очень :)
Аватара пользователя
Алексей Пикуров
Сервер поправлен, залит на сайт - http://www.nsoft-s.com/downloadmychat.html

viewtopic.php?f=35&t=1963

Версия сервера не изменена, для обновления нужно просто установить поверху. Скрипт изменять не нужно.
Volldemar
Hobit писал(а):Сервер поправлен, залит на сайт - http://www.nsoft-s.com/downloadmychat.html

http://www.nsoft-s.com/forum/viewtopic.php?f=35&t=1963

Версия сервера не изменена, для обновления нужно просто установить поверху. Скрипт изменять не нужно.


Исправления коснулись поля "дата рождения", которое некоторые особо стеснительные пользователи не заполняют. Теперь вновь регистрируемым (как в веб-чате, так и простая регистрация) при Не заполнении данного поля, будет присваиваться дата 01.01.1900. И данная дата будет пропускаться скриптом "поздравлялки", т.е. такие пользователи не будут получать поздравление с Днём рождения.
Volldemar
Volldemar писал(а):Скопипастил текст скрипта -поздравлялки, но на сервере, в редакторе скриптов, русские буквицы отображаются крякозяблами. Какую кодировку воспринимает редактор скриптов сервера?


Проблему решил следующим способом:

В папке System32 файл C_1252.NLS меняем на C_1251.NLS(любым, удобным способам).
Для этого сначала дал себе права владельца, переименовал 1252 в 1252.old, а 1251 скопировал в другую директорию и там его переименовал в C_1252.NLS. Затем переименованный файл скопировал в директорию System32 и перезагрузился. После перезагрузки файл с расширением "old" можно удалить. Теперь все буквы на месте и показывают правильно. Система обращется к 1252, находит там 1251 и работает.

Способ нагуглил на просторах инета :)
Volldemar
Странно, после обновления скрипт не хочет поздравлять, сегодня как раз есть кого...

Сорри, таки работает :)
Volldemar
Подправте пожалуйста скрипт, что бы поздравлял и тех, у кого припало ДР на суб. и воскр., и как то это писалось в поздравлении, что вот такого то числа (суббота) или (воскресенье), поздравляем бла-бла-бла :)
Аватара пользователя
Алексей Пикуров
Попробуйте сами это сделать, если есть желание. Скрипт открыт, API тоже. Скриптовый движок для того и создавался, чтобы пользователи могли сами им пользоваться и расширяли возможности MyChat. Хотя бы попытайтесь.
Volldemar
Hobit писал(а):Попробуйте сами это сделать, если есть желание. Скрипт открыт, API тоже. Скриптовый движок для того и создавался, чтобы пользователи могли сами им пользоваться и расширяли возможности MyChat. Хотя бы попытайтесь.

Желание - есть, но нет соответствующего образования...
Вот если что нить по ВЧ радиотехнике, то пожалуйста...
Аватара пользователя
Алексей Пикуров
Попробуйте. Хватит школьных знаний по Паскалю, я вас уверяю :) А что неясно - мы расскажем и поможем. Тем более, в скрипте есть комментарии, поясняющие, что и как. Для людей же делали.
Volldemar
Hobit писал(а):Попробуйте. Хватит школьных знаний по Паскалю, я вас уверяю :) А что неясно - мы расскажем и поможем. Тем более, в скрипте есть комментарии, поясняющие, что и как. Для людей же делали.

Вы будете смеяться, но когда я учился в школе, был предмет "информатика", и всё "изучение" происходило на доске преподавателя и в тетрадках в клеточку :), тогда не было в школах персоналок...
Понимаю, что некогда, что это не оплачивается, ну раз нет, так нет, не буду больше беспокоить глупыми просьбами...
Аватара пользователя
Алексей Пикуров
Сделаем, если будет время лишнее. Или кто-то из пользователей, может, "расщедрится" раньше нас :)
Ein
Появилась идея добавить к этому скрипту функцию оповещения о завтрашних именинниках. Но не в виде объявления на доске а в виде сообщения в чат.
Составить список завтрашних поздравлялок несложно: добавляем еще одну переменную(например t), и как мне подсказали в личном письме от суппорта - завтрашнее время будет получено командой
t := mGetBirthdayUsers(IncHour(Now, 24));
Затем в срипт добавляем еще один цикл while в котором s меняем на t.
А вот как прописать команду на отправку Ботом сообщения в канал чата я не понял. Основная проблема в том, что сервером управляю удаленно через TV и почему то комбинация ctrl+пробел для просмотра списка функций не срабатывает =)
Соответственно - хочу узнать функцию отправки Ботом сообщения в чат и её параметры(важно отправить сообщение в главный канал по времени когда все пользователи на местах).
Аватара пользователя
Алексей Пикуров
Функция отправки сообщения в канал: function mSendChannelMessage(iUID: integer; sMsg:string): integer

Для того, чтобы узнать UID канала по его имени, воспользуйтесь функцией function mGetTextChannelUIDByName(sName: string): integer
Ein
Прекрасно! А сообщение можно сделать с привязкой к определенному часу? Или например, если в цикл добавить проверку текущего часа, то откуда взять параметр текущего времени?
Идеально было бы отправлять сообщение точно по времени. Например в 9:20 или в 12:10.
Аватара пользователя
Алексей Пикуров
Текущее время можно получить функцией Now.
А procedure DecodeDateTime(dt: double; var wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliSec: word) поможет "распарсить" Now на "составные части" (часы/минуты/секунды...).

Например:
Код: Выделить всё
var
  wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliSec: word;
begin
  DecodeDateTime(Now, wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliSec);

    if (wHour = 9) and (wMinute = 20) then {bla-bla-bla};
end;

Навесить этот скрипт на выполнение каждую минуту:
scripteveryminute.png

Этот как вариант, способов можно ещё придумать :)
Ein
И в довершение: какой функцией получить из профиля год рождения? желательно в integer
А так же интересно, в скриптовом сообщении возможно указать параметры теста? (размер, шрифт и т.д.)

Как получу готовый скрипт - обязательно выложу его сюда =)
Аватара пользователя
Алексей Пикуров
Получение даты рождения пользователя:

function mGetUserAttribute(iUIN: integer; sAttributeName: string): string

Дата получается в виде строки в формате "dd/mm/yyyy hh:nn:ss" (без кавычек).
Код: Выделить всё
var
  s: string;
  iYear: integer;
begin
  s := mGetUserAttribute(12, 'HOME_BIRTHDAY');
 
    if s <> '' then iYear := strtoint(copy(s, 7, 4))
      else iTear := -1;
end;
Аватара пользователя
Алексей Пикуров
P.S. Форматирование текста есть, но в справке пока не описано, напишите, что вы хотите сделать, я напишу, какие теги использовать.

Полное описание тегов форматирования текста будет немного позже. Их там много :)
Ein
Хорошо, посмотрю что получится =) Спасибо!
Денис
Проблему решил следующим способом:

В папке System32 файл C_1252.NLS меняем на C_1251.NLS(любым, удобным способам).
Для этого сначала дал себе права владельца, переименовал 1252 в 1252.old, а 1251 скопировал в другую директорию и там его переименовал в C_1252.NLS. Затем переименованный файл скопировал в директорию System32 и перезагрузился. После перезагрузки файл с расширением "old" можно удалить. Теперь все буквы на месте и показывают правильно. Система обращется к 1252, находит там 1251 и работает.

Способ нагуглил на просторах инета :)

Добрый день, проблема с кракозябрами такая же, стоит Server 2008 R2 64-bit, данный способ не помог исправить проблему. Что можете посоветовать?
Аватара пользователя
Алексей Пикуров
Здравствуйте, Денис.

Попробуйте:
viewtopic.php?p=8396#p8396
viewtopic.php?p=7123#p7123
Денис
Алексей Пикуров писал(а):Здравствуйте, Денис.

Попробуйте:
viewtopic.php?p=8396#p8396
viewtopic.php?p=7123#p7123

Перепробывал все, везде стоиит русский, замена с_1252.NLS тоже не решила пробему
Аватара пользователя
Алексей Пикуров
Денис, попробуйте погуглить, может что-то поможет. Я не знаю, что вам посоветовать. Если найдёте решение - пишите сюда.
Аватара пользователя
avas
У меня заработало вот так:
sToday := FormatDateTime('ddmmmmyyyy', Now); // получаем текущую дату

Формат даты в скрипте поправил.
Аватара пользователя
Алексей Пикуров
Как вы будете форматировать дату — дело вкуса.
Аватара пользователя
to$ter
Алексей нежданно свалилась напасть:
Скрипт начал поздравлять именинников ежечасно.
Из расследований:
// записываем в реестр текущую дату
RegSetString(HKEY_CURRENT_USER, 'Software\MyChatServerScripts\BirthdayReminder', sToday);
в реестре записывает первые 4 знака (год отбрасывает), соответствено сравнение
if sToday<>sOld никогда не будет ложь и мы поздравляем каждый час.
формат sToday := FormatDateTime('ddmmyyyy', Now);
если в скрипте вывысти переменную sToday на экран имеет требуемый формат, для сегодня например: 19072016
система win2012 64bit
сервер чата 5.20.0
служба запускается с системной учеткой.
Вложения
Буфер обмена01.jpg
скрин реестра
Буфер обмена01.jpg (34.85 КБ) Просмотров: 11822
Аватара пользователя
Алексей Пикуров
Здравствуйте. Проблему повторил, разбираюсь, в чём дело.
Аватара пользователя
Алексей Пикуров
Исправлено, проблема была связана с переводом сервера на UNICODE, на днях будет готово обновление.

Также сейчас готовлю раздел справки сервера, где описываются функции для работы с реестром.
Аватара пользователя
to$ter
Спасибо, с версии 5.21.0 заработало нормально.
Аватара пользователя
Алексей Пикуров
Отлично. Спасибо за уведомление.
Аватара пользователя
ovdt
Здравствуйте.
Сегодня обнаружил что отключился скрипт поздравления пользователей. При проверке скрипта выяснилось что ошибки в строках:
iSex := mGetUserSex(iUIN); // получение пола пользователя
sUserFullName := mGetUserFullName(iUIN, 0); // ... и полного имени

[Error] (38:21): Unknown identifier 'mGetUserSex'
[Error] (39:30): Unknown identifier 'mGetUserFullName'
Версия сервера 5.22.1.0 на предыдущей версии все работало.
Подскажите что можно сделать?
Аватара пользователя
to$ter
Та-же история(((
Аватара пользователя
Андрей Раков
ovdt писал(а):iSex := mGetUserSex(iUIN); // получение пола пользователя
sUserFullName := mGetUserFullName(iUIN, 0); // ... и полного имени

Эти функции нужно заменить на mGetUserFullNameByPreset + JSONGetInteger

Пример:
Код: Выделить всё
var
  sJSON: string;
  iSex: integer;
begin
  sJSON := mGetUserDataAsJSON(6, 'Sex');

  if JSONGetInteger(sJSON, "Sex", iSex) = 0 then
     // all ok
  else
     // error
end.


И mGetUserFullNameByPreset
Код: Выделить всё
sUserFullName := mGetUserFullNameByPreset(6, 0)

Как описано в справке, имя будет в формате "Александр Сергеевич Пушкин" для второго параметра "0".
Аватара пользователя
ovdt
Исправьте все пожалуйста в шапке темы сообщения в скрипте так как я сам не пойму куда вставить
Аватара пользователя
ovdt
Спасибо поставил без ошибок
Аватара пользователя
Coolboy
Добрый день!
На Server 2008 R2 64-bit подмена С_1252.NLS на 1251 проблему с кракозябрами решает ;)
Чтоб ушли знаки вопроса и появились кракозябры в "Языках и региональных стандартах" везде, где можно ставим русский, а потом подменяем шрифты.

Дано:
Сервер 5.2.0

Проблема в строке 40: Unknown identifier 'mGetUserDataAsJSON'

Подскажите куда копать. Заранее благодарю!
Аватара пользователя
Coolboy
Хм. Установил пробную версию сервера 5.24.0.64 и скрипт скомпилировался...
Но обновиться я на него , наверное, не смогу!? Как без перестановки узнать, подойдет ли моя лицензия?
Аватара пользователя
Coolboy
Ага, понял, как. Мой ключ до версии сервера 5.7... Где его качнуть и отработает ли там скрипт?
Аватара пользователя
Алексей Пикуров
Добрый день.
Ага, понял, как. Мой ключ до версии сервера 5.7... Где его качнуть и отработает ли там скрипт?

Нет, не отработает. У вас очень старая версия, нужно обновиться. Для этого нужно приобрести подписку на обновления на год или больше.

Дистрибутивы старых версий мы предоставляем только клиентам, напишите нам на support@nsoft-s.com, вышлем ссылку, если вы потеряли свой дистрибутив.
Аватара пользователя
Алексей Пикуров
P.S. В следующей версии мы полностью переходим на UNICODE, так что кракозябры исчезнут, как явление :)
Аватара пользователя
Coolboy
А можно его(скрипт) поправить под мою версию? [smilie=help.gif]
Аватара пользователя
Алексей Пикуров
Мы не занимаемся корректировкой старых версий и скриптов к ним, извините.
Аватара пользователя
Coolboy
Печально читать такие строки в службе техподдержки продукта, которым пользуешься...
Аватара пользователя
Алексей Пикуров
Почему? У нас нет физической возможности поддерживать древние версии MyChat, мы оказываем техническую поддержку и исправляем ошибки только в самой свежей версии. Для этого и есть подписка на обновления.

Версия 5.7 вышла очень давно, посмотрите историю версий.

Я вам с удовольствием помогу, но и вы обновитесь на самую свежую версию.
Аватара пользователя
Coolboy
Спасибо вам!

Я поправил скрипт ручками, все работает ;)
Аватара пользователя
Алексей Пикуров
Вот и прекрасно. Но обновиться я вам всё равно настоятельно рекомендую.
Аватара пользователя
tfosn
Версия 1.0 актуальна? 8 лет прошло
// Скрипт автоматических поздравлений с днями рождений //
// версия 1.0 от 02.10.2011
Аватара пользователя
Алексей Пикуров
Что мешает скопировать и вставить?)) Всё работает.
Аватара пользователя
Алексей Пикуров
UPD (18.01.2021)
Скрипт устарел, свежая версия для версии MyChat 8.3.3 и старше.
Аватара пользователя
AlexSun
Да, спасибо за скрипт. Еще неплохо было бы, чтобы предупреждал за 2-3 дня (за 3 дня, в пятницу - если в понед выпадает ДР)
Аватара пользователя
Алексей Пикуров
Пожалуйста. Поменяйте под свои нужды, это не проблема.