Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Разработчикам [PtokaX] _ Скрипты И Совметимость Операционных Систем

Автор: mariner 4.11.2008, 22:03

Собственно перешел я на Linux и послал венды куда-подальше. Ну и вылез вопросец со скриптами, ибо пути в Unix системах немного отличаются от аналогичных в Windows. В результате был загажен немного рут. Но дело даже не в этом. Некоторые скрипты, к примеру RSS лент, отлично пашут и не гадят своими файлами. Поэтому предлагаю нашим разработчикам подумать над этой проблемой и выбрать отптимальный код для совместимости операционок.

2 Setuper: Илья, тестовую площадку подготовлю, если что big_smile.gif

Автор: Setuper 10.11.2008, 23:20

Проблема совместимости некоторых скриптов заключается в путях к файлам и директориям.

Windows вообще говоря использует в путях как прямые (/), так и обратные слеши (\).
Unix'ы в путях используют только прямые слеши (/).

Отсюда возникает проблема совместимости скриптов на Windows и Unix системах.


Предлагаю эту проблему совместимости решать следующим образом:

В путях писать только прямые слеши:
Например, для API 2:

Код
dofile(Core.GetPtokaXPath().."scripts/file.lua")
Для API 1:
Код
dofile(frmHub:GetPtokaXLocation().."scripts/file.lua")

(функции Core.GetPtokaXPath() и frmHub:GetPtokaXLocation() возвращают пути с прямыми слешами)

При использовании той, или иной консольной команды (mkdir, rmdir и тд.) путь в параметре этой команды нужно заключать в двойные кавычки, тогда путь может содержать только прямые слешы, что как раз будет соответствовать предложенному принципу совместимости.

Предлагаю разработчикам учесть этот факт и писать универсальные скрипты, совместимые с обеими системами windows и unix!!!


Самый универсальный, кроссплатформенный и кроссхабный метод определения абсолютных путей:
Код
sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$"

Автор: mariner 11.11.2008, 0:29

грасиас

Автор: Setuper 14.12.2008, 21:18

Я тут ещё раз проверил... Толи глики у меня какие-то, то ли не знаю...

Проверти кто-нибудь создаёт ли данный скрипт папку test folder и вложенную в неё папку test folder2 ???

Код
function OnStartup()
  sPath = Core.GetPtokaXPath().."scripts/"
  os.execute("md \""..sPath.."test folder/test folder2\"")
end
function Main()
  sPath = frmHub:GetPtokaXLocation().."scripts/"
  os.execute("md \""..sPath.."test folder/test folder2\"")
end


У меня создаёт, хотя из моего топика выше у меня раньше не создавал...
Если это так, то можно писать везде только прямые слеши!

Автор: Sephiroth_Lukaw 14.12.2008, 21:26

API2 - Да.
API1 - Нет.
upd. Cорри, API1 при запущенном хабе, тоже.

Автор: Setuper 14.12.2008, 21:34

Спасибо, поправил мой пост. Для совместимости с обеими системами и win и unix достаточно писать пути используя функции Core.GetPtokaXPath() для API 2 и frmHub:GetPtokaXLocation() для API 1, и во всех путях следует писать только прямые слеши.

Соответственно для создания папок в аргументе команды пишутся также прямые слеши))

В команде удаления папки или файла в системе windows писать нужно обратные слеши!

Автор: Wariner 16.2.2009, 21:05

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

Код
function ShowHalloMessage(tUser)              
    Core.GetUserAllData(tUser)
    local sProfile = ""
    if CheckOwner(tUser) then
        sProfile = "Owner"
    else    
        sProfile = tProfiles[tUser.iProfile][4]
    end    
    local HalloText = loadtextfiles(sText.."hallo.txt");
    HalloText = string.gsub(HalloText, "%[USER%]", tUser.sNick)
    HalloText = string.gsub(HalloText, "%[IP%]", tUser.sIP)
    HalloText = string.gsub(HalloText, "%[HUB%]", SetMan.GetString(0))
    HalloText = string.gsub(HalloText, "%[BOTNAME%]", sBot)
    HalloText = string.gsub(HalloText, "%[USERA%]", Core.GetUsersCount()+1)
    HalloText = string.gsub(HalloText, "%[VERSION%]", "Ptokax "..Core.Version)
    HalloText = string.gsub(HalloText, "%[ACTUALPEAK%]", Core.GetActualUsersPeak())
    HalloText = string.gsub(HalloText, "%[MAXPEAK%]", tStat.MaxUsers)
    HalloText = string.gsub(HalloText, "%[MAXSHARA%]", GetNormalShare(tStat.MaxShara))
    HalloText = string.gsub(HalloText, "%[SHARKA%]", GetNormalShare(Core.GetCurrentSharedSize()+tUser.iShareSize))
    HalloText = string.gsub(HalloText, "%[SHARE%]", GetNormalShare(tUser.iShareSize))
    HalloText = string.gsub(HalloText, "%[MSGS%]", tUsers[tUser.sIP].Msg)
    HalloText = string.gsub(HalloText, "%[TIMES%]", GetNormalTime(tUsers[tUser.sIP].Time,1))
    HalloText = string.gsub(HalloText, "%[ROLE%]", sProfile)
    HalloText = string.gsub(HalloText, "%[SHARARECORD%]", GetNormalShare(tStat.MaxShara))
    HalloText = string.gsub(HalloText, "%[USERRECORD%]", tStat.MaxUsers)
    Core.SendToNick(tUser.sNick,HalloText)    
end


Код
function loadtextfiles(filename)
    local message = ""
    local f = io.open( filename, "r" )
    if f then
        message=f:read("*all")
        message=string.gsub(message,"|","")
        message=string.gsub(message,"\n","\r\n")
        f:close()
    end
    return message
end



upd: проблема решилась удалением строки:
Код
message=string.gsub(message,"\n","\r\n")

Автор: Setuper 16.2.2009, 23:44

Вообще говоря \r - это возврат каретки, \n - это перенос на следующую строку. Смысл заменять перенос строки на возврат каретки с переносом строки не ясен. Это же лишнее действие. Замена вертикальной черты тоже не совсем понятна, так как черту надо заменять на код этой черты.

Код
function loadtextfiles(filename)
    local f,message = io.open(filename)
    if f then
        message=f:read"*a"
        message=message:gsub("|","&#*124;")
        f:flush()
        f:close()
    end
    return message
end

* между &# и 124; удалить!

Автор: PomanoB 17.2.2009, 19:42

В Unix для разделения строк используется \n а в Windows \r\n, отсюда и лишние пустые строки

Автор: Setuper 17.2.2009, 20:10

в виндовсе возврат каретки вовсе необязательное действие, оно обязательно только в случае работы с окнами.

Автор: Sekas 22.2.2009, 10:13

Приветствую а как быть простому пользователю, который не разбирается в коде для определения совместим тот или иной плагин под Linux или нет? Пересматривать каждую строчку кода скриптов или ставить каждый плагин для проверки мягко говоря не очень удобный вариант. Может быть имеется список совместимых плагинов? Если его нету, то можно его создать совместными усилиями. Думаю многим это понадобится и избавит от необходимости уточнять этот вопрос в топике каждого плагина по отдельности.

Автор: Wariner 22.2.2009, 10:16

В начале темы ясно написано что различия только в путях, список чего ты хочешь создавать?!

Автор: Sekas 22.2.2009, 10:20

Цитата
В начале темы ясно написано что различия только в путях, список чего ты хочешь создавать?!

Как я понял из вышенаписанного, бывают случаи когда различие не только в путях. Список плагинов совместимых с *NIX системами из "коробки", в которые не надо лезть ручками и допиливать самому даже пускай такую мелочь, как пути.

Цитата
В Unix для разделения строк используется \n а в Windows \r\n, отсюда и лишние пустые строки

Автор: Setuper 22.2.2009, 12:19

Ну это уже зависит от разработчиков скриптов. Я приверженец написания универсальных, кросс платформенных скриптов. Однако некоторые скриптописатели принципиально не хотят писать универсальные скрипты, мотивируя это усложнением читаемости кода.

Автор: valdis73 30.3.2009, 12:01

Единственное непонял исправлять слеши во всём скрипте и нужно ли переписывать всю базу. Скажем на примере гостевой книги покажи что нужно исправить плиз

 GuestBook_newapi.lua ( 9.19 килобайт ) : 13
 

Автор: Wariner 30.3.2009, 12:38

заменить надо следующие строчки:

Код
path = Core.GetPtokaXPath().."scripts/dats" -- имя папки

gbfile=path.."/guestbook.dat" --имя файлв

nfile=path.."/news.dat" -- директория для файла

rfile=path.."/requests.dat" -- директория для файла

os.execute("mkdir ".."\""..path.."\"")

Автор: valdis73 30.3.2009, 12:42

Спасибо огроменное 2 месяца не мог добиться ответа на этот вопрос на куче сайтов

Но все равно не помогло....

Тупо так же выдаёт в чат !addrequest hgjkg

может и в базе нужно чего то менять?

Автор: Setuper 26.5.2009, 17:39

Свистопляска с кроссплатформенностью мультистрок.

Переводы строк для различных платформ:
\r\n для DOS формата,
\n - для UNIX формата,
\r - для Mac формата.

Для совместимости скриптов в UNIX и WINDOWS системах предлагается использовать перенос \n.

Кроссплатформенной альтернативой является lua мультистрока:

Код
str = [[line 1
line 2]]


Тёмной лошадкой является следующий метод перевода строки:
Код
str = "line1\
line2"

Автор: Setuper 3.6.2009, 12:43

Универсальный путь к запущеному скрипту:

Код
sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$"


Переменная sMainPath содержит этот самый путь, переменная sMainSlash содержит слеш, который используется системой для разделения директорий в путях.

Данный lua код будет работать везде где есть lua язык, вне зависимости от типа ОС и типа хаба!

Протестировано на следующих платформах:



Пример (подключение файлов):
Код
sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$"

dofile(sMainPath..("myfolder1/myfolder2/myfile.lua"):gsub('/', sMainSlash))

Замена слеша сделана и расчёта приведения пути к виду с одинаковыми слешами - слешами, которые использует ОС.

Автор: alex82 3.6.2009, 14:37

Цитата(Setuper @ 3.6.2009, 12:43) *
Универсальный путь к запущеному скрипту:
Код
sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$"
Думаю, будет не лишним добавить, что если данный способ используется не в "корневом" скрипте, а в скрипте, подгруженном при помощи dofile(), то необходимо увеличить значение аргумента функции debug.getinfo().

Автор: TiGRpp 15.11.2009, 13:43

Цитата(Setuper @ 26.5.2009, 18:39) *
Свистопляска с кроссплатформенностью мультистрок.

Переводы строк для различных платформ:
\r\n для DOS формата,
\n - для UNIX формата,
\r - для Mac формата.

У меня под CentOS 5.3 нормально работают скрипты с \r\n
А вот в указании пути потребовалось вводить ДВОЙНОЙ прямой слеш - "//"
Вместе с тем НЕ ВСЕ скрипты, содержащие относительный путь работают.

Из-за некоторых таких скриптов Птоха просто отключается в какой-то момент.

Подскажите КАК заменить относительный путь на абсолютный, к примеру в скрипте AnekBot.lua

Впрочем проблема может быть в ином: скрипт Kinozal_tv.lua не имеет папки с файлами, и в нем не прописан путь к ней, однако, как и с AnekBot.lua, после включения скрипта Птоха через некоторое время отключается полностью.

Автор: Setuper 15.11.2009, 18:41

\r\n в юниксах может работать, тут ничего удивительного нету, однако принято что в юниксах перенос строки это \n. Придерживаясь стандарта, можно в будущем избежать ошибок.

По поводу двойного слеша // - это не так. Как любая юникc система сентос использует одиночный слеш /

Автор: TiGRpp 16.11.2009, 6:43

\r\n слишком много по всем скриптам у меня, чтобы их изменять на \n для юникса. Напомните, влияет ли такое положение на быстродействие? - в дереве сообщений по теме не просто найти что нужно, а как раскрыть все сообщения, я пока не нашел...big_smile.gif
Касательно двойного слеша: я не помню полностью ситуацию (за неимением достаточных познаний подбирал опытно), но в любом случае скрипты, содержащие в указании пути одиночные прямые и обратные слеши, согласились работать в сентос только с двойным прямым...

Автор: Wariner 16.11.2009, 7:51

Цитата(TiGRpp @ 16.11.2009, 6:43) *
в дереве сообщений по теме не просто найти что нужно, а как раскрыть все сообщения, я пока не нашел...big_smile.gif

найди кнопку опции в верху темы нажи, потом нажми на стандартный вид и будет тебе счастье))))

Автор: TiGRpp 16.11.2009, 18:11

Цитата(Setuper @ 15.11.2009, 19:41) *
По поводу двойного слеша // - это не так. Как любая юникc система сентос использует одиночный слеш /

Я исправил в скриптах двойной слеш на одинарный...все работает...big_smile.gif

Спасибо.

\r\n вместо \n сильно критично, или можно оставить как есть?

Автор: Setuper 16.11.2009, 18:16

Не критично. Чисто соглашение, которое в некоторых системах может иметь и другие представления. Однако \n - это основное, которое поддерживается всеми unix системами без исключения.

Автор: TiGRpp 1.12.2009, 12:03

Цитата(Wariner @ 30.3.2009, 14:38) *
заменить надо следующие строчки:
Код
path = Core.GetPtokaXPath().."scripts/dats" -- имя папки

gbfile=path.."/guestbook.dat" --имя файлв

nfile=path.."/news.dat" -- директория для файла

rfile=path.."/requests.dat" -- директория для файла

os.execute("mkdir ".."\""..path.."\"")

В данном примере нет завершения: какой именно строкой их заменить? А иллюстрация здесь необходима для объяснения теоретических выкладок.

У меня есть другой пример:
Код
local sScriptsPath = Core.GetPtokaXPath():gsub("/", "\\").."scripts\\"
local sPath = "PM.Offline-No.Gemorroy\\"
local sPostFile = "tPost.tbl"

local sLogFile = "OfflinePostLog.log" -- лог-файл

Я несколько раз прочел все сообщения данной темы, но не смог понять как применить способ sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$" в моем случае.

Автор: Nickolya 1.12.2009, 12:20

просто убери

Код
:gsub("/", "\\")
и везде поменяй \\ на /

Автор: TiGRpp 1.12.2009, 13:07

Цитата(Nickolya @ 1.12.2009, 14:20) *
просто убери
Код
:gsub("/", "\\")
и везде поменяй \\ на /

Спасибо, работает.
Только вот ясности в применении кроссплатформенного метода sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$" не прибавилось, которым, надо полагать, можно было заменить указания пути в обоих упомянутых случаях.

Это было б необходимо для какого-нибудь третьего случая, что бы уже править самостоятельно...big_smile.gif

Автор: Setuper 1.12.2009, 13:14

А что тут непонятного?
Функция Core.GetPtokaXPath() есть только а птохе.

А конструкция

Код
sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$"
будет работать в любом LUA скрипте. В переменной sMainPath будет содержаться абсолютный путь до интерпретируемого скрипта, а в переменной sMainSlash будет содержаться слеш, кторый используется в вашей системе.

Автор: TiGRpp 1.12.2009, 13:18

Цитата(Setuper @ 1.12.2009, 15:14) *
А что тут непонятного?
Функция Core.GetPtokaXPath() есть только а птохе.

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

Автор: Setuper 1.12.2009, 13:29

Заметьте, что функция Core.GetPtokaXPath() возвращает абсолютный путь выполняемого файла (в данном случае путь до файла PtokaX.exe), а предложенная конструкция возвращает путь до интерпретируемого скрипта.

Например, у нас в папке scripts есть скрипт test.lua. Тогда для того, чтобы определить абсолютный путь, по которому находится этот скрипт, мы можем сделать так:

Цитата
sMainPath = Core.GetPtokaXPath().."scripts/"
или же так:
Код
sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$"



Другой пример. В папке scripts находится некая папка folder, и в этой папке folder находится некий файл test2.lua, который мы хотим подключить из скрипта test.lua. В этом случае можно сделать так:
Код
sMainPath = Core.GetPtokaXPath().."scripts/"
sPath2 = sMainPath.."folder/"
dofile(sPath2.."test2.lua")
или же так:
Код
sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$"
sPath2 = sMainPath.."folder"..sMainSlash
dofile(sPath2.."test2.lua")


Надеюсь теперь понятны тонкости обращения с тем и другим способом?

Автор: TiGRpp 1.12.2009, 14:14

Цитата(Setuper @ 1.12.2009, 15:29) *
Надеюсь теперь понятны тонкости обращения с тем и другим способом?

Спасибо, исчерпывающе.

Автор: Trans 2.12.2009, 8:04

Цитата
Надеюсь теперь понятны тонкости обращения с тем и другим способом?

Setuper, ты меня извини, конечно, но ты этот способ - sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$" - проталкиваешь уже больше года, наверно, но вот только сейчас снизошёл до объяснения, как применить на практике...Лично я тоже не понимал, как применить. До этого момента. Хотя прекрасно обходился без него, ставя / вместо \\

Автор: Вятич 2.2.2011, 22:35

Здравия !
Я пути в скриптах исправил, но они не загружаются на ptokax_0.4.1.2c-2~eglibc_i386.deb
!getscripts показывает,что скрипты есть но не загруженные.
Как их загрузить и проверить правильность написания ?
Может кто выложит рабочие скрипты (на ptokax_0.4.1.2c-2~eglibc_i386.deb) для примера ?

Автор: Ksan 3.2.2011, 1:42

По-моему, на безгуйных птоках надо до запуска Птоки открыть файл Scripts.xml и там поставить 1 вместо 0 для каждого названия скрипта вот так:

Цитата
<Enabled>1</Enabled>

Либо попробуй при запущенной Птоке применить команду
Цитата
!startscript <название скрипта>

Автор: Вятич 3.2.2011, 2:02

Благодарю за ответ,вопрос решён.
Только скрипт для управления в меню теперь сразу показывает все возможные команды,надо будет другой поискать
А так хорошо бы скрипты для ptokax под линуксом где-то опубликовать

Автор: Ksan 3.2.2011, 3:16

Скрипты для Птоки не делятся на линуксовые или иные, они все работают и на линуксах (с учётом оговорок в данной теме), ну и с заменой виндовых библиотек на линуксовые при необходимости.