myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему

> Функции Для Разработчиков, склад полезных функций

Setuper
сообщение 6.9.2008, 15:58
Сообщение #1


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Привожу полное преобразование на lua из кодировки cp1251 (Ansi) в utf-8 и обратно, с помощью функций AnsiToUtf8 и Utf8ToAnsi соответственно:

Код
local ansi_decode={
  [128]='\208\130',[129]='\208\131',[130]='\226\128\154',[131]='\209\147',[132]='\226\128\158',[133]='\226\128\166',
  [134]='\226\128\160',[135]='\226\128\161',[136]='\226\130\172',[137]='\226\128\176',[138]='\208\137',[139]='\226\128\185',
  [140]='\208\138',[141]='\208\140',[142]='\208\139',[143]='\208\143',[144]='\209\146',[145]='\226\128\152',
  [146]='\226\128\153',[147]='\226\128\156',[148]='\226\128\157',[149]='\226\128\162',[150]='\226\128\147',[151]='\226\128\148',
  [152]='\194\152',[153]='\226\132\162',[154]='\209\153',[155]='\226\128\186',[156]='\209\154',[157]='\209\156',
  [158]='\209\155',[159]='\209\159',[160]='\194\160',[161]='\209\142',[162]='\209\158',[163]='\208\136',
  [164]='\194\164',[165]='\210\144',[166]='\194\166',[167]='\194\167',[168]='\208\129',[169]='\194\169',
  [170]='\208\132',[171]='\194\171',[172]='\194\172',[173]='\194\173',[174]='\194\174',[175]='\208\135',
  [176]='\194\176',[177]='\194\177',[178]='\208\134',[179]='\209\150',[180]='\210\145',[181]='\194\181',
  [182]='\194\182',[183]='\194\183',[184]='\209\145',[185]='\226\132\150',[186]='\209\148',[187]='\194\187',
  [188]='\209\152',[189]='\208\133',[190]='\209\149',[191]='\209\151'
}
local utf8_decode={
  [128]={[147]='\150',[148]='\151',[152]='\145',[153]='\146',[154]='\130',[156]='\147',[157]='\148',[158]='\132',[160]='\134',[161]='\135',[162]='\149',[166]='\133',[176]='\137',[185]='\139',[186]='\155'},
  [130]={[172]='\136'},
  [132]={[150]='\185',[162]='\153'},
  [194]={[152]='\152',[160]='\160',[164]='\164',[166]='\166',[167]='\167',[169]='\169',[171]='\171',[172]='\172',[173]='\173',[174]='\174',[176]='\176',[177]='\177',[181]='\181',[182]='\182',[183]='\183',[187]='\187'},
  [208]={[129]='\168',[130]='\128',[131]='\129',[132]='\170',[133]='\189',[134]='\178',[135]='\175',[136]='\163',[137]='\138',[138]='\140',[139]='\142',[140]='\141',[143]='\143',[144]='\192',[145]='\193',[146]='\194',[147]='\195',[148]='\196',
    [149]='\197',[150]='\198',[151]='\199',[152]='\200',[153]='\201',[154]='\202',[155]='\203',[156]='\204',[157]='\205',[158]='\206',[159]='\207',[160]='\208',[161]='\209',[162]='\210',[163]='\211',[164]='\212',[165]='\213',[166]='\214',
    [167]='\215',[168]='\216',[169]='\217',[170]='\218',[171]='\219',[172]='\220',[173]='\221',[174]='\222',[175]='\223',[176]='\224',[177]='\225',[178]='\226',[179]='\227',[180]='\228',[181]='\229',[182]='\230',[183]='\231',[184]='\232',
    [185]='\233',[186]='\234',[187]='\235',[188]='\236',[189]='\237',[190]='\238',[191]='\239'},
  [209]={[128]='\240',[129]='\241',[130]='\242',[131]='\243',[132]='\244',[133]='\245',[134]='\246',[135]='\247',[136]='\248',[137]='\249',[138]='\250',[139]='\251',[140]='\252',[141]='\253',[142]='\254',[143]='\255',[144]='\161',[145]='\184',
    [146]='\144',[147]='\131',[148]='\186',[149]='\190',[150]='\179',[151]='\191',[152]='\188',[153]='\154',[154]='\156',[155]='\158',[156]='\157',[158]='\162',[159]='\159'},[210]={[144]='\165',[145]='\180'}
}

local nmdc = {
  [36] = '$',
  [124] = '|'
}

function AnsiToUtf8(s)
  local r, b = ''
  for i = 1, s and s:len() or 0 do
    b = s:byte(i)
    if b < 128 then
      r = r..string.char(b)
    else
      if b > 239 then
        r = r..'\209'..string.char(b - 112)
      elseif b > 191 then
        r = r..'\208'..string.char(b - 48)
      elseif ansi_decode[b] then
        r = r..ansi_decode[b]
      else
        r = r..'_'
      end
    end
  end
  return r
end

function Utf8ToAnsi(s)
  local a, j, r, b = 0, 0, ''
  for i = 1, s and s:len() or 0 do
    b = s:byte(i)
    if b < 128 then
      if nmdc[b] then
        r = r..nmdc[b]
      else
        r = r..string.char(b)
      end
    elseif a == 2 then
      a, j = a - 1, b
    elseif a == 1 then
      a, r = a - 1, r..utf8_decode[j][b]
    elseif b == 226 then
      a = 2
    elseif b == 194 or b == 208 or b == 209 or b == 210 then
      j, a = b, 1
    else
      r = r..'_'
    end
  end
  return r
end

big_smile.gif
Go to the top of the page
+Quote Post
Setuper
сообщение 13.9.2008, 18:06
Сообщение #2


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Функция приведения к нижнему регистру:
Код
function String2Lower(s)
  local r, b = ''
  s = s:lower()
  for i = 1, s:len() do
    b = s:byte(i)
    if b > 191 and b < 224 then
      b = b + 32
    elseif b == 168 or b == 184 then
      b = 229
    end
    r = r.._G.string.char(b)
  end
  return r
end

Функция приведения к верхнему регистру:
Код
function String2Upper(s)
  local r, b = ''
  s = s:upper()
  for i = 1, s:len() do
    b = s:byte(i)
    if b > 223 then
      b = b - 32
    elseif b == 168 or b == 184 then
      b = 197
    end
    r = r.._G.string.char(b)
  end
  return r
end



Более оптимальные по выполнению функции:
Код
String2Lower = function(s)
  for i = 192, 223 do
    s = s:gsub(_G.string.char(i), _G.string.char(i + 32))
  end
  s = s:gsub(_G.string.char(168), _G.string.char(184))
  return s:lower()
end

Код
String2Upper = function(s)
  for i = 224, 255 do
    s = s:gsub(_G.string.char(i), _G.string.char(i - 32))
  end
  s = s:gsub(_G.string.char(184), _G.string.char(168))
  return s:upper()
end


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 14.9.2008, 11:36
Сообщение #3


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Функции форматирования шары:
Код
function GetNormalShare(s)
  s = tonumber(s) or 0
  if s >= 1125899906842624 then return (math.floor(1000 * s / 1125899906842624) / 1000).." ПБ"
  elseif s >= 1099511627776 then return (math.floor(1000 * s / 1099511627776) / 1000).." TБ"
  elseif s >= 1073741824 then return (math.floor(1000 * s / 1073741824) / 1000).." ГБ"
  elseif s >= 1048576 then return (math.floor(1000 * s / 1048576) / 1000).." МБ"
  elseif s >= 1024 then return (math.floor(1000 * s / 1024) / 1000).." КБ"
  else return s.." Б" end
end

Код
function GetLongShare(s)
  s = tonumber(s) or 0
  local r = ''
  if s >= 1125899906842624 then r = r ~= '' and r..(" %s ПБ"):format(math.floor(s / 1125899906842624)) or r..math.floor(s / 1125899906842624).." ПБ" s = math.fmod(s, 1125899906842624) end
  if s >= 1099511627776 then r = r ~= '' and r..(" %s ТБ"):format(math.floor(s / 1099511627776)) or r..math.floor(s / 1099511627776).." ТБ" s = math.fmod(s, 1099511627776) end
  if s >= 1073741824 then r = r ~= '' and r..(" %s ГБ"):format(math.floor(s / 1073741824)) or r..math.floor(s / 1073741824).." ГБ" s = math.fmod(s, 1073741824) end
  if s >= 1048576 then r = r ~= '' and r..(" %s МБ"):format(math.floor(s / 1048576)) or r..math.floor(s / 1048576).." МБ" s = math.fmod(s, 1048576) end
  if s >= 1024 then r = r ~= '' and r..(" %s КБ"):format(math.floor(s / 1024)) or r..math.floor(s / 1024).." КБ" s = math.fmod(s, 1024) end
  if s < 1024 then r = r ~= '' and r..(" %s Б"):format(s) or r..s.." Б" end
  return r
end


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 15.9.2008, 22:31
Сообщение #4


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Функции преобразования ip адреса в число и обратно:
Код
function Ip2Num(sIP)
  local a, b, c, d = sIP:match"^(%d+)%.(%d+)%.(%d+)%.(%d+)$"
  return a * 16777216 + b * 65536 + c * 256 + d
end
function Num2Ip(i)
  i = tonumber(i) or 0
  local r, d, zd = '', '.', "0."
  if i >= 16777216 then r = math.floor(i / 16777216)..d i = math.fmod(i, 16777216) else r = zd end
  if i >= 65536 then r = r..math.floor(i / 65536)..d i = math.fmod(i, 65536) else r = r..zd end
  if i >= 256 then r = r..math.floor(i / 256)..d i = math.fmod(i, 256) else r = r..zd end
  return r..i
end
Можно использовать для проверки рангов ip и для оптимального хранения ip адресов в бд.


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 23.9.2008, 17:05
Сообщение #5


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Еще несколько интересных методов. Может кому понадобятся, может кого заинтересует (Я использую их в больших проектах. Они несколько сворачивают длинные выкладки).
Код
tSys={}
function tSys:Table(t)                return type(t)=="table" and t end
function tSys:TableNoVoid(t)             return self:Table(t) and next(t) and t end
function tSys:TableOrDef(t,d)         return self:Table(t) or d or {} end
function tSys:TableNoVoidOrDef(t,d)        return self:TableNoVoid(t) or self:TableOrDef(t,d) end
function tSys:Table2(t,s)             return self:Table(t) and self:Table(t[s]) and t[s] end
function tSys:TableNoVoid2(t,s)         return self:Table2(t,s) and next(t[s]) and t[s] end
function tSys:TableOrDef2(t,s,d)        return self:Table(t) and (self:Table(t[s]) and t[s] or d or rawset(t,s,{}) and t[s]) or {} end
function tSys:TableNoVoidOrDef2(t,d)    return self:TableNoVoid2(t) or self:TableOrDef2(t,d) end
function tSys:String(s)             return type(s)=="string" and s end
function tSys:StringNoVoid(s)         return self:String(s) and s~="" and s end
function tSys:StringOrDef(s,d)         return self:String(s) or d or "" end
function tSys:StringNoVoidOrDef(s,d)     return self:StringNoVoid(s) or self:StringOrDef(s,d) end
function tSys:String2(t,s)             return self:Table(t) and self:String(t[s]) and t[s] end
function tSys:StringNoVoid2(t,s)         return self:String2(t,s) and t[s]~="" and t[s] end
function tSys:StringOrDef2(t,s,d)        return self:Table(t) and (self:String(t[s]) and t[s] or d or rawset(t,s,"") and t[s]) or "" end
function tSys:StringNoVoidOrDef2(s,d)     return self:StringNoVoid2(s) or self:StringOrDef2(s,d) end
function tSys:Number(i)             return type(i)=="number" and i end
function tSys:NumberOrDef(i,d)         return self:Number(i) or d or 0 end
function tSys:StringOrNumber(s)         return self:String(s) or self:Number(s) end
function tSys:NumberOfString(s)         return self:String(s) and tonumber(s) and s end
function tSys:ToNumber(s)             return self:String(s) and tonumber(s) or self:Number(s) end
function tSys:NoVoid(s)             return self:StringNoVoid(s) or self:Number(s) end
function tSys:Eq0(s)                 return self:Number(s) and s==0 and s end
function tSys:Eq1(s)                 return self:Number(s) and s==1 and s end
function tSys:Eq2(s)                 return self:Number(s) and s==2 and s end
function tSys:Eq01(s)                 return self:Number(s) and (s==0 or s==1) and s end

--метод возвращает количество ВСЕХ полей таблицы (а не только количество индексных полей как функции table.getn или table.maxn)
function tSys:GetN(t)
    local c=0 for _ in pairs(t) do c=c+1 end return c
end


P.S. Существуют различия между методами и функциями. tSys:GetN(t) - метод, tSys.GetN(t) - функция


Спасибо сказали:
Go to the top of the page
+Quote Post
Sephiroth_Lukaw
сообщение 3.12.2008, 19:05
Сообщение #6


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 307
Регистрация: 11.7.2008
Пользователь №: 173
Спасибо сказали: 31 раз




Часто их теряю. Так что здесь оставлю. Надеюсь никто не против(знаю, что функция всем известная).
/*
Serialize(tTable - Сама таблица, sTableName - Имя таблицы, hFile - Хендлер файла, т.е. нужен уже открытый файл) - Сохраняет таблицу в файле.
--------------------
SaveTable(sFile - Путь к файлу, tTable - Сама таблица, sTableName - Имя таблицы) - Сохраняет таблицу в файле с помощью функции Serialize - т.е. она должна быть уже определена! -, отличие в том, что она сама открывает файл и закрывает его после выполнения поставленной задачи(т.е. нужен уже не hFile, а путь к нему).
*/
Код
function Serialize(tTable, sTableName, hFile, sTab)
  sTab = sTab or ''
  hFile:write(sTab..sTableName.." = {\n")
  for k, v in pairs(tTable) do
    if type(v) ~= "function" then
      local sKey = type(k) == "string" and ("[%q]"):format(k) or ("[%d]"):format(k)
      if type(v) == "table" then
        Serialize(v, sKey, hFile, sTab..'\t')
      else
        local sValue = type(v) == "string" and ("%q"):format(v) or tostring(v)
        hFile:write(sTab..'\t'..sKey.." = "..sValue)
      end
      hFile:write(",\n")
    end
  end
  hFile:write(sTab.."}")
end

function SaveTable(sFile, tTable, sTableName)
  local hFile = io.open(sFile, "w+")
  Serialize(tTable, sTableName, hFile)
  hFile:close()
end


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 30.1.2009, 13:21
Сообщение #7


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Функция коррекции данных пользователя.
Если клиент неизвестен для хаба, то тэг клиента дописывается в описание. Данная функция извлекает тэг из описания и корректно прописывает данные пользователя (такие как слоты, хабы, режим и тд.).
Данная функция корректно воспринимает тэг Авалинка.
Код
function GetNormalValue(tUser)
  if not tUser.sTag and tUser.sDescription then
    local sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit = tUser.sDescription:match"(.*)(<(.+)%sV?:?(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+)>)$"
    if not sDescription then
      sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit = tUser.sDescription:match"(.*)(<(.+)%sV?:?(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+),L:(%d+)>)$"
    end
    if not sDescription then
      sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit = tUser.sDescription:match"(.*)(<(.+)%sV?:?(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+),B:(%d+)>)$"
    end
    tUser.sDescription=sDescription
    tUser.sTag=sTag
    tUser.sClient=sClient
    tUser.sClientVersion=sClientVersion
    tUser.sMode=sMode
    tUser.iNormalHubs=tonumber(iNormalHubs)
    tUser.iRegHubs=tonumber(iRegHubs)
    tUser.iOpHubs=tonumber(iOpHubs)
    tUser.iHubs=tonumber(iNormalHubs and iRegHubs and iOpHubs and (iNormalHubs + iRegHubs + iOpHubs))
    tUser.iSlots=tonumber(iSlots)
    tUser.iLlimit=tonumber(iLlimit)
  end
  return tUser
end


Использование метода:
Код
function UserConnected(tUser)
  tUser=GetNormalValue(tUser)
  ...
end


Спасибо сказали:
Go to the top of the page
+Quote Post
alex82
сообщение 7.2.2009, 17:28
Сообщение #8


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Функция форматирования шары, решающая сию проблему чисто математически.
Код
function GetNormalSize(size, num)
    size = size or 0
    local tSize, sSize = {" B"," kB"," MB"," GB"," TB"," PB"}, ""
    for i in pairs(tSize) do
        if size < 1000 then
            sSize = tSize[i]
            break
        end
        size = size/1024
    end
    local tmp1, tmp2 = 1, 0
    if size > 0 then
        num = num or 3
        while size < 10^num do
            size, tmp1 = size*10, tmp1*10
        end
        size, tmp2 = math.modf(math.floor(size)/10); tmp2 = tmp2*10
        if tmp2 >=5 then size = size+1 end
        size = size/tmp1*10
    end
    return tostring(size)..sSize
end

Первый аргумент - собственно размер шары в байтах, второй - до скольки знаков округлить значение шары. Если второй аргумент отсутствует, шара округляется до 3-х знаков.


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 7.2.2009, 18:25
Сообщение #9


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Недоработанный алгоритм. Простейшая проверка GetNormalSize(1052, 4) не даёт 4 знака после запятой (1.0273), а округляет до 1.027, то есть до третьего знака.
Go to the top of the page
+Quote Post
alex82
сообщение 7.2.2009, 18:52
Сообщение #10


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Цитата(Setuper @ 7.2.2009, 17:25) *
Недоработанный алгоритм. Простейшая проверка GetNormalSize(1052, 4) не даёт 4 знака после запятой (1.0273), а округляет до 1.027, то есть до третьего знака.

А там разве сказано "после запятой"?
Go to the top of the page
+Quote Post
Setuper
сообщение 7.2.2009, 19:07
Сообщение #11


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




А что тогда означает выражение: "до скольки знаков округлить значение шары" ??

Код
function GetNormalSize(s, n)
    s=s and tonumber(s) or 0
    n=n and "%."..n.."f" or "%.3f"
    if s>=1125899906842624 then return string.format(n,s/1125899906842624).." ПБ"
    elseif s>=1099511627776 then return string.format(n,s/1099511627776).." TБ"
    elseif s>=1073741824 then return string.format(n,s/1073741824).." ГБ"
    elseif s>=1048576 then return string.format(n,s/1048576).." МБ"
    elseif s>=1024 then return string.format(n,s/1024).." КБ"
    else return s.." Б" end
end


Спасибо сказали:
Go to the top of the page
+Quote Post
sphinx
сообщение 7.2.2009, 19:16
Сообщение #12


Активный участник
***

Группа: Заблокированные
Сообщений: 87
Регистрация: 16.10.2008
Пользователь №: 805
Спасибо сказали: 35 раз




Код
function getNormalShare(share)
    local i,tUnits = 1, {"B","KB","MB","GB","TB","PB","EB"}
    while share > 1024 do share = share / 1024 i = i + 1 end
    return string.format("%.3f",share).." "..(tUnits[i] or "??")
end


Спасибо сказали:
Go to the top of the page
+Quote Post
alex82
сообщение 7.2.2009, 19:22
Сообщение #13


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Цитата(Setuper @ 7.2.2009, 18:07) *
А что тогда означает выражение: "до скольки знаков округлить значение шары" ??

Это означает что если значение 543.905234 GB, то вернётся 544 GB, а если 1.1834456 GB, то 1.18 GB
Go to the top of the page
+Quote Post
Setuper
сообщение 7.2.2009, 20:33
Сообщение #14


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Не знаю для чего нужно округлять до количества цифр, обычно округляют до какого-то знака после запятой, ну да ладно.

Самый быстрый по выполнению мой код, так как в ветке выполнения содержится минимальное количество операций, однако очень порадовал код sphinx-а))) :
Код
function GetNormalShare(s,n)
  local i,t=1,{"Б","КБ","МБ","ГБ","ТБ","ПБ"}
  s=s and tonumber(s) or 0
  n=n and "%."..n.."f " or "%.3f "
  while s>0x400 do s,i=s/0x400,i+1 end
  return n:format(s)..(t[i] or "??")
end

1) Цикл пробегается от меньшего значения - оптимизация прохода (большинство пользователей не имеют большой шары)
2) Цикл while, а не for, поэтому для выхода из цикла не нужен оператор break (в случае прохода по for i=1,6 нужен был оператор break)
3) Код не громоздкий


Спасибо сказали:
Go to the top of the page
+Quote Post
alex82
сообщение 7.2.2009, 21:05
Сообщение #15


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Цитата
Не знаю для чего нужно округлять до количества цифр, обычно округляют до какого-то знака после запятой

Из соображений целесообразности. Ведь если шара 954.542324234 GB, то имеет смысл избавиться от всех знаков после запятой, поскольку такая точность в большинстве случаев не нужна. Ну а если 1.978678, то нужно оставить хотябы 2 знака потому что 1.978678 и 1 отличаются почти в 2 раза (хотя, юзеров с такой шарой надо банить, а не формарировать их шару big_smile.gif)

PS. Какой смысл в этом выражении:
Код
s=s and tonumber(s) or 0

Не проще ли?
Код
s=s or 0
Go to the top of the page
+Quote Post
Setuper
сообщение 7.2.2009, 21:10
Сообщение #16


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




дело в том, что в некоторых случаях шара из себя представляет строку: "47345783456", поэтому строка приводится к числу, хотя это можно выбросить, если контролировать это.
Go to the top of the page
+Quote Post
alex82
сообщение 9.2.2009, 22:54
Сообщение #17


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Код
function ValidateNickArrival(user,data)
    Core.SendToUser(user, "Здесь пишем наше сообщение")
end
Функция отправляет юзеру сообщение при входе на хаб. При этом сообщение отправляется раньше, чем остальные, в том числе и "копирайт" PtokaX. Выглядит это примерно так:

Go to the top of the page
+Quote Post
Setuper
сообщение 15.2.2009, 22:40
Сообщение #18


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Аналог стандартной LUA функции для PtokaX:
Код
function _G.print(...)
  local m = ''
  for i = 1, _G.select('#', ...) do
    m = m..tostring(_G.select(i, ...))
  end
  Core.SendToAll(m)
end


Использование:
Код
print("55 qwerty ", 34, " ", 66, " str ", 12, " 78 ", 0x22b==555)





Функции работы с бинарными числами.

Функция, преобразующая десятичное число в бинарную строку:
Код
function tobin(n)
  local m, x = ''
  while n >= 2 do
    n, x = _G.math.modf(n / 2)
    m = 2 * x..m
  end
  return n ~= 0 and '1'..m or '0'
end


Функция, преобразующая бинарную строку в десятичное число:
Код
tonumber(str, 2)


Можно использовать для раздачи собственных прав профилям хаба. Например, на хабе профили: 0 - Master, 1 - Operator, 2 - VIP, 3 - Reg, -1 - UnReg. Профили можно записать в двоичную строку. Будем полагать, что строка "11111" разрешает всем пяти профилям то или иное действие, строка "10000" разрешает действие только профилю Master. Думаю, что ясен смысл.


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 16.2.2009, 14:17
Сообщение #19


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Работа со стеком:
Код
  top=0;
  data={};
  push=function(name,...)
    top=top+1
    name=name or top
    data[top]=name
    data[tostring(name)]=top
    return name
  end
  pop=function(...)
    local name=table.remove(data)
    top=top-1
    if data[name] then
      data[name]=nil
    end
    return name
  end
  getindex=function(name,...)
    return name and -top+data[tostring(name)]-1 or 0
  end
  clean=function()
    top,data=0,{}
  end


Функция push помещает элемент в стек, функция pop извлекает последний элемент из стека, функция getindex возвращает глубину элемента в стеке, функция clean очищает стек.
Go to the top of the page
+Quote Post
Setuper
сообщение 18.2.2009, 21:17
Сообщение #20


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Очередная интересная по реализации функция форматирования шары:
Код
local t={"Б","КБ","МБ","ГБ","ТБ","ПБ"}
local function loop(i,n,c)
  if i<0x400 then coroutine.yield(n:format(i)..(t[c] or "??"))end
  return loop(i/0x400,n,c+1)
end
GetNormalShare=coroutine.wrap(function(s,n)return loop(s and tonumber(s) or 0,n and "%."..n.."f " or "%.3f ",1)end)


Использование:
Код
Core.SendToAll(GetNormalShare(142589996842624,4))


Спасибо сказали:
Go to the top of the page
+Quote Post

4 страниц V   1 2 3 > » 
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts Вопрос по функции
0 000000 4 476 7.1.2018, 12:55 Посл. сообщение: 000000
No new От: Функции Для Разработчиков
От темы с ID: 334
19 Nickolya 18 905 22.2.2014, 15:22 Посл. сообщение: Ksan
No New Posts От: Вызов функции без возврата
От темы с ID: 4632
1 LoT 5 918 3.2.2011, 8:08 Посл. сообщение: ScOol
No New Posts Вызов функции без возврата
1 dimajak 7 864 1.2.2011, 2:55 Посл. сообщение: Ksan
No New Posts ВАЖНО: Topic has attachmentsФункции ===> Читаем, Дабы Не Задавать Вопросов <===
Скрипт-интерфейс PtokaX Lua. ВСЕ СКРИПТОВЫЕ ФУНКЦИИ PtokaX API
6 Svyat 37 454 11.10.2010, 15:50 Посл. сообщение: Nickolya
No New Posts Общие функции
хочется меньше писанины и больше скорости
1 RAND(i)M 6 218 9.9.2010, 0:01 Посл. сообщение: alex82
Closed ВАЖНО: Topic has attachmentsLua Api Функции Hex Хаба
Описание функций
1 Jaska 10 681 22.6.2010, 22:07 Посл. сообщение: Saymon21
No new Topic has attachmentsИщу разработчиков ADC Хабов
обменяться мнениями.
28 SysMan 39 233 9.4.2010, 10:16 Посл. сообщение: Delion
No New Posts От: Функции ===> Читаем, Дабы Не Задавать Вопросов <===
От темы с ID: 118
1 Setuper 6 512 20.2.2010, 22:54 Посл. сообщение: _Герой_
Moved Ищу разработчиков ADC Хабов
обменяться мнениями.
0 SysMan 0 3.7.2009, 19:57 Посл. сообщение: SysMan
No New Posts Topic has attachmentsLua Api Функции Hex Хаба
Описание функций
3 Setuper 9 092 3.6.2009, 18:31 Посл. сообщение: Jaska
No New Posts Защта от функции грейлинка
Как обезопасить себя и хаб
2 valdis73 7 558 25.4.2009, 17:55 Посл. сообщение: valdis73
No New Posts Функции Irc бота
Написать функции
1 zangriEBP 7 022 25.4.2009, 10:48 Посл. сообщение: zangriEBP
No New Posts От: Функции ===> Читаем, Дабы Не Задавать Вопросов <===
От темы с ID: 118
1 MEXAHuK 6 442 27.1.2009, 19:32 Посл. сообщение: MEXAHuK
No New Posts От: Функции
От темы с ID: 118
9 Wariner 14 017 26.11.2008, 16:00 Посл. сообщение: Setuper

 



RSS Сейчас: 27.11.2024, 2:53