Вверх ↑
Этот топик читают: Гость
Ответов: 84
Рейтинг: 1
#1: 2013-01-04 18:52:52 ЛС | профиль | цитата
Решил сделать инструмент для мониторинга и сохранения в лог активности пользователей на форуме.
Первая проблема с которой столкнулся - необходимость авторизации.
Почитал форум и понял, что сам я авторизацию на HiAsm не создам. Но меня вполне устроит использование компонента Web Browser. Вроде даже получается уже что-то.
Однако есть нюансы. Если прогу свернуть в трей, то через какое-то время Web Browser подвисает. В развернутом виде вроде пашет стабильно. Можно конечно и не сворачивать, но будет не так удобно.
карма: 1

0
vip
#1.1контекстная реклама от партнеров
Ответов: 84
Рейтинг: 1
#2: 2013-01-08 23:25:40 ЛС | профиль | цитата
C получением данных проблем не возникло, а вот с интерфейсной частью (элемент StringTamleMT) как-то не могу разобраться.

Хочу, что бы в зависимости от содержимого строки (а конкретно от выполняемого действия) строки бы выделялись разным цветом. Например если пользователь просматривает тему - цвет один, а если отвечает - цвет другой. При попытке включить ColorItems в True у меня в логе всё смещается на один столбец влево.

Вот мой прототип, для опытов...
code_30002.txt
карма: 1

0
файлы: 1code_30002.txt [1.9KB] [363]
Разработчик
Ответов: 26066
Рейтинг: 2120
#3: 2013-01-09 00:54:01 ЛС | профиль | цитата
NordWest писал(а):
элемент StringTamleMT

Ой как бы я не советывал использовать этот компонент. Не могу понять, чем он вас всех так прельщает, когда есть более продвинутый компонент -- MTStrTbl
------------ Дoбавленo в 00.54:
Вот, как вариант

Add(MainForm,15605431,280,238)
{
Left=20
Top=105
Width=623
Height=317
Caption="LSMF"
BorderStyle=1
Point(onClose)
Point(Handle)
}
Add(FormatStr,4287192,385,322)
{
DataCount=5
Mask="0#%49%29%19%3"
Point(FString)
link(onFString,347735:doEnum,[(433,328)(433,424)(391,424)(391,440)])
link(Str1,2566876:String,[(391,288)(349,288)])
link(Str2,14488693:String,[])
link(Str3,14878113:String,[(405,288)(447,288)])
link(Str4,15615955:Var,[(412,300)(573,300)])
}
Add(If_else,5745068,455,434)
{
link(onTrue,347735:doStop,[(497,440)(497,473)(393,473)(393,447)])
link(Op2,11609953:Var3,[(468,369)])
}
Add(ArrayEnum,347735,399,434)
{
onBreakEnable=0
link(onItem,5745068:doCompare,[])
link(onEndEnum,11249959:doAdd,[(444,447)(444,360)(373,360)(373,384)])
link(Array,11249959:Strings,[])
}
Add(StringTableMT,11249959,385,378)
{
Left=10
Top=10
Width=595
Height=245
Columns=#7:Дата=40|6:Имя=80|24:Выполняемое действие=450|
StrDelimiter="9"
ColorItems=0
IconsCheck=[]
MiscIcons=[]
Icons=[]
Point(Strings)
link(Str,11609953:Var2,[])
}
Add(Button,6003742,280,315)
{
Left=10
Top=260
Caption="Послать"
link(onClick,5857126:doEvent1,[])
}
Add(Button,13157151,280,385)
{
Left=535
Top=260
Width=70
Caption="Очистить"
link(onClick,11249959:doClear,[])
}
Add(GetDataEx,11609953,385,364)
{
link(Data,4287192:FString,[])
}
Add(ComboBox,14488693,385,210)
{
Left=75
Top=260
Height=21
Strings=#5:21:11|5:21:12|5:21:13|5:21:14|5:21:15|
Text=""
}
Add(ComboBox,2566876,336,210)
{
Left=135
Top=260
Width=105
Height=21
Strings=#4:User|9:Moderator|14:Supermoderator|5:Admin|5:Гость|
Text=""
}
Add(ComboBox,14878113,434,210)
{
Left=245
Top=260
Width=205
Height=21
Strings=#19:Просматривает форум|34:Просматривает тему (название темы)|31:Отвечает в тему (название темы)|30:Изменяет настройки уведомлений|20:Неизвестное действие|0:|0:|
Text=""
Point(Index)
}
Add(SelectColor,11225031,567,140)
{
Color=9616595
}
Add(GetIndexData,15615955,567,245)
{
Count=5
link(Data1,11225031:Result,[])
link(Data2,780342:Result,[(580,209)(615,209)])
link(Data3,6142379:Result,[(587,209)(657,209)])
link(Data4,8920040:Result,[(594,209)(699,209)])
link(Data5,7884256:Result,[(601,209)(741,209)])
}
Add(DoData,431168,511,245)
{
link(onEventData,15615955:doIndex,[])
link(Data,14878113:Index,[(517,233)(485,233)(485,267)(454,267)])
}
Add(Hub,5857126,336,315)
{
link(onEvent1,431168:doData,[(492,321)(492,251)])
link(onEvent2,4287192:doString,[])
}
Add(SelectColor,780342,609,140)
{
Color=9426626
}
Add(SelectColor,6142379,651,140)
{
Color=13161107
}
Add(SelectColor,8920040,693,140)
{
Color=13876114
}
Add(SelectColor,7884256,735,140)
{
Color=12095446
}


карма: 22

0
Ответов: 84
Рейтинг: 1
#4: 2013-01-09 22:33:39 ЛС | профиль | цитата
nesco писал(а):
Не могу понять, чем он вас всех так прельщает
Чем чем - незнанием элементарной базы HiAsm. Просто я сначала делал на StringTable, а потом смотрю - есть более продвинутый, но по подключению очень похожий элемент.

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

карма: 1

0
Ответов: 1535
Рейтинг: 176
#5: 2013-01-09 23:27:52 ЛС | профиль | цитата
nesco писал(а):
Не могу понять, чем он вас всех так прельщает
Внешняя простота.
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#6: 2013-01-10 00:39:59 ЛС | профиль | цитата
ser_davkin писал(а):
Внешняя простота

Кажущаяся внешняя простота. Если использовать этот компонент серьезно, то запаришься ему обвязку делать
карма: 22

0
Ответов: 84
Рейтинг: 1
#7: 2013-01-10 01:05:28 ЛС | профиль | цитата
Все, я сдаюсь. Как поиск делать на MTStrTbl и как новые строки в таблицу добавлять я разобрался.
А вот скрестить эти две функции не получается хоть тресни.
Мне нужно, что бы строка добавлялась в таблицу только если её там ещё нет.
Для этого я сначала делаю поиск и по отрицательным результатам поиска предполагал добавлять строку.
И нифига - не могу сообразить, как после условия подать на вход RowAction событие+данные.

code_30008.txt
карма: 1

0
файлы: 1code_30008.txt [1.7KB] [336]
Разработчик
Ответов: 26066
Рейтинг: 2120
#8: 2013-01-10 01:15:29 ЛС | профиль | цитата
NordWest писал(а):
Мне нужно, что бы строка добавлялась в таблицу только если её там ещё нет

А критерии сравнения какие
Да и откуда там могут взяться повторные строки, мне не очень ясно
Да если в этом логе будут тысячи событий, то запаришься в них повторы искать. Что-то мне подсказывает, что это неправильное решение
карма: 22

0
Ответов: 84
Рейтинг: 1
#9: 2013-01-10 07:32:32 ЛС | профиль | цитата
Парсер будет мониторить лог активности за последние 15 минут. А следоватедьно в эти 15 минут вероятны полные повторы строк. За границей 15 минут мониторить смысла нет.
карма: 1

0
Ответов: 1535
Рейтинг: 176
#10: 2013-01-10 09:11:40 ЛС | профиль | цитата
NordWest писал(а):
не могу сообразить, как после условия подать на вход RowAction событие+данные.

Add(MainForm,15605431,280,322)
{
Left=20
Top=105
Width=623
Height=317
Caption="LSMF"
BorderStyle=1
Point(onClose)
Point(Handle)
}
Add(FormatStr,4287192,350,259)
{
DataCount=3
Mask="%2;%1;%3"
Point(FString)
link(onFString,11515050:doGetIndex,[])
link(Str1,2566876:String,[(356,225)(314,225)])
link(Str2,14488693:String,[])
link(Str3,14878113:String,[(370,225)(412,225)])
}
Add(Button,6003742,280,259)
{
Left=10
Top=260
Caption="Послать"
link(onClick,4287192:doString,[])
}
Add(ComboBox,14488693,350,147)
{
Left=75
Top=260
Height=21
Strings=#5:21:11|5:21:12|5:21:13|5:21:14|5:21:15|
Text=""
}
Add(ComboBox,2566876,301,147)
{
Left=135
Top=260
Width=105
Height=21
Strings=#4:User|9:Moderator|14:Supermoderator|5:Admin|5:Гость|
Text=""
}
Add(ComboBox,14878113,399,147)
{
Left=245
Top=260
Width=205
Height=21
Strings=#19:Просматривает форум|34:Просматривает тему (название темы)|31:Отвечает в тему (название темы)|30:Изменяет настройки уведомлений|20:Неизвестное действие|0:|0:|
Text=""
Point(Index)
}
Add(MT_String,16356153,560,294)
{
link(onResult,4206320:doRowAction,[])
}
Add(MST_RowAction,4206320,609,294)
{
MSTControl="123"
}
Add(MTStrTbl,4820124,336,322)
{
Left=10
Top=10
Width=590
Name="123"
Columns=#7:Дата=40|6:Имя=80|24:Выполняемое действие=450|
}
Add(StrList,11515050,490,217)
{
Point(doGetIndex)
Point(onGetIndex)
Point(EndIdx)
link(Str,4287192:FString,[(496,198)(426,198)(426,303)(356,303)])
link(onGetIndex,1657262:doCompare,[])
}
Add(If_else,1657262,539,224)
{
Op2=Integer(-1)
link(onTrue,14791842:doEvent1,[])
}
Add(Hub,14791842,581,224)
{
link(onEvent1,11515050:doAdd,[(603,230)(603,208)(478,208)(478,223)])
link(onEvent2,8381662:doRead,[(607,237)(607,275)(492,275)(492,314)])
}
Add(ArrayRW,8381662,504,308)
{
link(onRead,16356153:doMTString,[])
link(Array,11515050:Array,[])
link(Index,11515050:EndIdx,[])
}
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Ответов: 84
Рейтинг: 1
#11: 2013-01-10 10:34:50 ЛС | профиль | цитата
ser_davkin, классное решение, хотя до конца так и не понял, как работает. Как я понял в StrList будут копиться строки параллельно с добавлением в основную таблицу строк, и если нужно будет что-то изменить в одной таблице - изменения необходимо делать и в другой. Ну это частности. В любом случае решение крайне интересное - сам бы я до такого не додумался, спасибо.

nesco писал(а):
Да если в этом логе будут тысячи событий, то запаришься в них повторы искать.
Да, вероятно алгоритм нужно переделывать. Я с переполнением лога пока боролся так - добавил на форму кнопку "сохранить" по которой сбрасывал накопленное в файл, а список строк обнулял. Но мне всё равно такое решение не нравилось - не оптимальное, да и требует обязательного ручного вмешательства.

Парсер запрашивает данные раз в минуту. В ответе присутствует сразу несколько строк. Среди этих строк могут появляться строки, которые были в предыдущем запросе. Вероятно нужно где-то хранить содержимое предыдущего запроса и искать совпадения только в нем.
карма: 1

0
Ответов: 1535
Рейтинг: 176
#12: 2013-01-10 10:37:34 ЛС | профиль | цитата
NordWest, вот решение с удалением устаревших записей. Для наглядности в 10 секунд.

Add(MainForm,15605431,112,161)
{
Left=20
Top=105
Width=617
Height=321
Caption="LSMF"
BorderStyle=1
Point(onClose)
Point(Handle)
}
Add(FormatStr,4287192,252,203)
{
DataCount=3
Mask="%2;%1;%3"
Point(FString)
link(onFString,11515050:doGetIndex,[])
link(Str1,2566876:String,[(258,169)(216,169)])
link(Str2,9496182:DateTime,[])
link(Str3,14878113:String,[(272,169)(314,169)])
}
Add(Button,6003742,161,203)
{
Left=10
Top=260
Caption="Послать"
link(onClick,9994811:doEvent1,[])
}
Add(ComboBox,2566876,203,98)
{
Left=85
Top=260
Width=105
Height=21
Strings=#4:User|9:Moderator|14:Supermoderator|5:Admin|5:Гость|
Text=""
}
Add(ComboBox,14878113,301,98)
{
Left=195
Top=260
Width=205
Height=21
Strings=#19:Просматривает форум|34:Просматривает тему (название темы)|31:Отвечает в тему (название темы)|30:Изменяет настройки уведомлений|20:Неизвестное действие|0:|0:|
Text=""
Point(Index)
}
Add(MTStrTbl,4820124,112,203)
{
Left=10
Top=10
Width=590
Height=240
Name="123"
Columns=#8:Дата=150|6:Имя=80|24:Выполняемое действие=450|
}
Add(StrList,11515050,371,161)
{
Point(doGetIndex)
Point(onGetIndex)
Point(EndIdx)
link(Str,4287192:FString,[(377,148)(334,148)(334,246)(258,246)])
link(onGetIndex,1657262:doCompare,[])
}
Add(If_else,1657262,420,168)
{
Op2=Integer(-1)
link(onTrue,11515050:doAdd,[(462,174)(462,154)(359,154)(359,167)])
}
Add(DateDiff,12705188,497,392)
{
link(onCalc,200667:doSeparateMT,[])
link(DateTime1,9313117:DateTime,[])
}
Add(ArrayEnum,9007903,385,392)
{
link(onItem,14899369:doSplit,[])
link(Array,14633374:Var2,[])
}
Add(MT_MultiData,200667,546,392)
{
link(onData1,5036263:doCompare,[])
}
Add(Hub,9994811,210,203)
{
link(onEvent1,4287192:doString,[])
link(onEvent2,742404:doEvent1,[(236,216)(236,391)])
}
Add(If_else,5036263,602,392)
{
@Hint=#64:Разница в 10 секунд. Установи 900 секунд для разницы в 15 минут.|
Type=2
Op2=Integer(10)
link(onTrue,15305970:doData,[])
AddHint(-87,-101,199,26,@Hint)
}
Add(DoData,15305970,658,392)
{
link(onEventData,1010409:doEvent1,[(706,398)(706,328)(324,328)(324,272)])
link(Data,9007903:Index,[(664,383)(641,383)(641,436)(398,436)])
}
Add(Time,9313117,490,350)
{
Format="D-M-Y h:m:s"
Point(DateTime)
}
Add(Time,9496182,252,112)
{
Format="D-M-Y h:m:s"
Point(DateTime)
}
Add(MST_Clear,15450865,315,350)
{
MSTControl="123"
}
Add(Hub,742404,259,385)
{
OutCount=3
link(onEvent1,15450865:doClear,[(294,391)(294,356)])
link(onEvent2,1855106:doWork2,[])
link(onEvent3,2853078:doEnum,[(353,405)(353,475)])
}
Add(Hub,1010409,336,266)
{
link(onEvent1,11515050:doDelete,[(360,272)(360,181)])
link(onEvent2,1855106:doWork1,[(361,279)])
}
Add(HubEx,1855106,357,392)
{
link(onEvent,9007903:doEnum,[])
}
Add(ArrayEnum,2853078,434,469)
{
PColor(Array,16755200)
link(onItem,7136794:doSplit,[])
link(Array,14633374:Var3,[(440,376)])
}
Add(MultiStrPart,7136794,476,469)
{
Direct=1
link(onSplit,5662884:doConvert,[])
}
Add(DateConvertor,5662884,518,469)
{
Mode=9
Format="d-M-y h:m:s"
Point(Result)
link(onResult,9736192:doAdd,[(562,475)(562,499)(471,499)(471,524)])
}
Add(MST_RowAction,9320027,532,518)
{
MSTControl="123"
}
Add(MT_AddData,9736192,483,518)
{
Count=3
link(onAdd,9320027:doRowAction,[])
link(Data1,5662884:Result,[(489,510)(524,510)])
link(Data2,7136794:Part2,[(496,510)(489,510)])
link(Data3,7136794:Part1,[(503,510)(482,510)])
}
Add(GetDataEx,14633374,385,371)
{
PColor(Data,16755200)
link(Data,11515050:Array,[])
}
Add(MultiStrData,14899369,455,392)
{
Count=1
link(onPart1,12705188:doCalc,[])
}
Если изменения произойдут в StrList, значит после перебора это затронет и содержание в таблице.
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
файлы: 1code_30012.txt [3.2KB] [321]
Ответов: 16884
Рейтинг: 1239
#13: 2013-01-10 11:28:18 ЛС | профиль | цитата
ser_davkin писал(а):
вот решение
Только применение БД спасёт изобретателей велосипеда. ИМХО.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)