zhem4ag Posted January 5, 2011 Share Posted January 5, 2011 Недавно захотел написать свой аддон и для начала хотел поработать с почтой, но столкнулся со следующей проблемой. Мне нужно было узнать число писем в почтовом ящике и для этого я написал следующее: Code: Global("wtMainPanel", nil) Global("wtText", nil) Global("mailIds", {}) function RegEvents() common.RegisterEventHandler(OnMailboxActivated, "EVENT_MAILBOX_ACTIVATED") end function RegWidgets() wtMainPanel = mainForm:GetChildChecked("MainPanel", false) wtText = wtMainPanel:GetChildChecked("Text", false) end function OnMailboxActivated() mailIds = mailBox.RequestMailIds() local mailCount = GetTableSize(mailIds) wtText:SetVal("value", common.FormatInt(mailCount, "%d")) end function Init() RegEvents() RegWidgets() end Init() В результате на экране я увидел 0, хотя в почте есть письма, правда они все были открыты. Или функция RequestMailIds() возвращает только Id непрочитанных писем? Если так, то как можно узнать список Id всех писем в почтовом ящике? Quote Link to comment Share on other sites More sharing options...
SLA Posted January 5, 2011 Share Posted January 5, 2011 Вроде, всё написано правильно. Функция mailBox.RequestMailIds() используется в аддонах AutoDeleteMail и AucEDSman именно для получения количества писем. Может быть, какая-то другая ошибка произошла, может, что-нибудь есть в логе Mods.txt? Кстати, эта функция, "при необходимости" запрашивает данные с сервера: Quote: Выдает текущий известный список писем. При необходимости отсылается запрос на обновление списка. При необходимости отсылается запрос на обновление списка. В аддоне AutoDeleteMail, она, для верности, окружена проверкой на mailBox.IsReady(): Code: if mailBox.IsReady() then mailTempList = mailBox.RequestMailIds() end Quote Link to comment Share on other sites More sharing options...
zhem4ag Posted January 5, 2011 Author Share Posted January 5, 2011 Не понимаю я чего-то. В теории всё должно работать. Дополнил функцию: Code: function OnMailboxActivated() LogInfo("mailStart...") if mailBox.IsActive() then mailIds = mailBox.RequestMailIds() end local mailCount = GetTableSize(mailIds) LogInfo("mailCount = ", mailCount) wtText:SetVal("value", common.FormatInt(mailCount, "%d")) end И на экране я вижу 0 и в mods.txt не вижу ошибок, только то что я хотел вывести: Code: Info: addon Test: mailStart... Info: addon Test: mailCount = 0 После всего этого, используя аддон AucEDSman, забираю все деньги из почты. Правда не всё сразу, а поочереди из каждого письма. Но он хоть как-то работает. А у меня-то говорит, что почта вообще пуста. Есть идеи? Quote Link to comment Share on other sites More sharing options...
SLA Posted January 9, 2011 Share Posted January 9, 2011 Возможно, в этом коде где-то закралась ошибка, незаметная глазу. В таких случаях, иногда, проще переписать кусочек кода заново, чем искать в нём эту ошибку. Если не поможет, то можно пробовать миксовать код рабочего аддона с нерабочим. Буквально, взять какой-нибудь AucEDSman или AutoDeleteMail, и постепенно превращать его в свой аддон, проверяя на каждом шаге, работает ли он. До тех пор, пока он не превратится в твой аддон, только рабочий. Затем, если будет всё ещё неясно, в чём разница между рабочей и нерабочей версиями аддона - сравнить их в WinMerge. Quote Link to comment Share on other sites More sharing options...
zhem4ag Posted January 9, 2011 Author Share Posted January 9, 2011 Спасибо за совет. Попробую на досуге. Quote Link to comment Share on other sites More sharing options...
icreator Posted January 20, 2011 Share Posted January 20, 2011 нет - код нормальный но логика ненормальная дело в том что в такой системе как клиент-сервер все надо строить на событиях - а событие OnMailboxActivated() - не дает факта о том что получен список. короче говоря - окно почты хоть и открыто, но список писем еще не получен попробуйте эти события: EVENT_MAILS_CHANGED EVENT_MAILBOX_CHANGED Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.