def _sync(self): logging.info('SYNC WORKER: START') items = Sync.all() items.filter('done =',False) items = items.fetch(100) if len(items) == 0: logging.info('SYNC WORKER: Brak zadań. Kończę pracę.') return True for item in items: t = datetime.datetime(*time.strptime(str(item.created).split('.')[0],"%Y-%m-%d %H:%M:%S")[0:5]) difference = datetime.datetime.now() - t minutes, seconds = divmod(difference.seconds, 60) if minutes > settings.SYNC_LIMIT_MIN: logging.info('Szukam SyncAnswers.syncId = %s', (item.key().id())) ans = SyncAnswers.all() ans.filter('syncId =',item.key().id()) ans = ans.fetch(100) if len(ans) == 0: logging.info(item.jid) xmpp.send_message(item.jid,u'Nikt nie odpowiedział na Twoją synchronizację dotyczącą plików:\n%s' % (item.files)) item.done = True item.put() continue # Zobacz jakie byly odpowiedzi odpTak = 0 odpNie = 0 osobyNie = [] jids = [] for an in ans: jids.append(an.jid) if an.syncCmd: odpTak=odpTak+1 else: odpNie=odpNie+1 osobyNie.append(an.jid) # Message do autora msg = '' if odpTak > 0 and odpNie == 0: msg = u'Wszyscy zgodzili się na Twoje synchro. Osób za %s, przeciwko %s.' msg = msg % (odpTak,odpNie) elif odpNie > 0 and odpTak == 0: msg = u'Nikt nie zgodził się na Twoje synchro. Osób za %s, przeciwko %s. Osoby przeciwko to:\n' msg = msg % (odpTak,odpNie) for osoba in osobyNie: msg=msg+osoba+'\n' else: msg = u'Odpowiedź na Twoje synchro: osób za %s, przeciwko %s. Osoby przeciwko to:\n' msg = msg % (odpTak,odpNie) for osoba in osobyNie: msg=msg+osoba+'\n' xmpp.send_message(item.jid,msg) # Message do tych co oddali odpowiedz msg = 'Wyniki głosowania o synchro w którym brałeś udział to: osób za %s, przeciwko %s.' msg = msg % (odpTak,odpNie) xmpp.send_message(jids,msg) item.done = True item.put()
def _get(self): self.view['lastSync'] = [] self.view['ile'] = self._limit lastSync = Sync.all() lastSync.order('-__key__') lastSync = lastSync.fetch(10) if len(lastSync) > 0: ids = '' for item in lastSync: ids+=str(item.key().id())+',' query = SyncAnswers.gql("WHERE syncId IN (%s)" % (ids[0:-1])) wynik = query.fetch(100) odp = {} liczniki = {} if len(wynik) > 0: for i in wynik: if False == odp.has_key(int(i.syncId)): odp[int(i.syncId)] = [] liczniki[int(i.syncId)] = {'za':0,'przeciw':0} odp[int(i.syncId)].append({'jid':i.jid,'syncCmd':i.syncCmd}) if(True == i.syncCmd): liczniki[int(i.syncId)]['za']+=1 else: liczniki[int(i.syncId)]['przeciw']+=1 self.view['answers'] = odp for item in lastSync: if False == liczniki.has_key(int(item.key().id())): liczniki[int(item.key().id())] = {'za':0,'przeciw':0} self.view['lastSync'].append({ 'id':item.key().id(), 'jid':item.jid, 'created':item.created, 'done':item.done, 'files':item.files, 'za' : liczniki[int(item.key().id())]['za'], 'przeciw' : liczniki[int(item.key().id())]['przeciw'] }) self.view['liczniki'] = liczniki
def sync_command(self, message=None): jid = message.sender.split('/')[0] if Roster.check_jid(jid) == False: return False pliki = message.arg.strip().replace("\r"," ") pliki = re.sub('\n',' ',pliki) logging.info('SYNC: %s from %s' % (pliki,jid)) cmd = pliki.split(' ') if(len(pliki) == 0): message.reply('Podaj listę plików, które chesz synchronizować - wpisz np.: /sync mojPlik.php robertaPlik.php') #elif(len(pliki) < 5): elif (len(cmd) > 0 and cmd[0] in ['off','on','ok','yes','tak','nie','no']): # /sync off if pliki == 'off': r = Roster.findByJid(jid) if r <> None: r.syncCmd = False r.put() message.reply('Informacje o plikach do synchronizacji nie będą już więcej wysyłane do Ciebie. Zawsze możesz to zmienić wpisująć /sync on') logging.info('SYNC OFF: %s' % (jid)) return True # /sync on if pliki == 'on': r = Roster.findByJid(jid) if r <> None: r.syncCmd = True r.put() message.reply('Od tej chwili będziesz otrzymywał informacje o plikach do synchronizacji. Zawsze możesz to zmienić wpisująć /sync off') logging.info('SYNC ON: %s' % (jid)) return True # /sync ok | yes | tak # /sync ok 1234 if len(cmd) > 0 and cmd[0] in ['ok','yes','tak','nie','no']: syncOdp = False if cmd[0] in ['ok','yes','tak']: syncOdp = True #Sprawdz czy ktos pyta o synchro sync = Sync.all() sync.filter('done =',False) sync.order("-__key__") item = sync.fetch(10) # Brak sync if len(item) == 0: message.reply('W tej chwili nikt nie synchronizuje plików. Jeżeli sam chcesz coś synchronizować wpisz np.: /sync plik1.php') return False # Więcej niż 1 elif len(item) > 1: multiSync = [] for i in item: if i.jid == jid: continue if self._checkSyncTime(i): multiSync.append(i) if len(multiSync) > 0: if len(cmd) > 1 and cmd[1] != None: try: idSync = int(cmd[1]) # Sprawdz czy id sync istnieje, jak tak to oznacz logging.info('Sprawdzam czy istnieje sync %s' % (idSync)) for i in multiSync: if i.key().id() == idSync: logging.info('Sync istnieje') syncAns = SyncAnswers.all() syncAns.filter("jid =",jid) syncAns.filter("syncId =",i.key().id()) syncAns = syncAns.fetch(1) if len(syncAns) > 0: sync = syncAns[0] sync.syncCmd = syncOdp sync.put() message.reply('Twoja odpowiedź została zaktualizowana.') return True SyncAnswer = SyncAnswers(syncId=i.key().id(),jid=jid,syncCmd=syncOdp) SyncAnswer.put() message.reply('Dziękuje za odpowiedź.') return True message.reply('Aktualnie nie ma synchro o identyfikatorze `%s`. Popraw i spróbuj ponownie :)' % (idSync)) return False except ValueError: logging.info('Blad parsowania') message.reply(u'Identyfikator `%s` nie jest poprawną liczbą. Popraw i spróbuj ponownie :)' % (cmd[1])) return False wiadomosc = u'W tym samym czasie przeprowadzanych jest %s pytań o synchro:\n' % (len(multiSync)) for i in multiSync: wiadomosc+=u'%s) %s: *%s*\n' % (i.key().id(),i.jid,i.files) wiadomosc+=u'Odpisz np `/sync ok %s` by zgodzić się na pierwsze synchro' % (multiSync[0].key().id()) message.reply(wiadomosc) else: message.reply('W tej chwili nikt nie synchronizuje plików.') return False # Jedno synchro t = datetime.datetime(*time.strptime(str(item[0].created).split('.')[0],"%Y-%m-%d %H:%M:%S")[0:5]) difference = datetime.datetime.now() - t minutes, seconds = divmod(difference.seconds, 60) logging.info('SYNC ok diff: %s' % (minutes)) if minutes > settings.SYNC_LIMIT_MIN: message.reply('W tej chwili nikt nie synchronizuje plików. Ostatnia prośba o synchro miało miejsce %s minut temu.' % (minutes)) return False #Sprawdz czy synchro nie robie ja sam if item[0].jid == jid: message.reply('Trwa zbieranie odpowiedzi od innych osób. Poczekaj cierpliwie na odpowiedź w sprawie Twojego synchro.') return False #Sprawdz czy juz odpowiadales sync = SyncAnswers.all() sync.filter("jid =",jid) sync.filter("syncId =",item[0].key().id()) sync = sync.fetch(1) if len(sync) > 0: sync = sync[0] sync.syncCmd = syncOdp sync.put() message.reply('Twoja odpowiedź została zaktualizowana.') return True #Odpowiedz SyncAnswer = SyncAnswers(syncId=item[0].key().id(),jid=jid,syncCmd=syncOdp) SyncAnswer.put() message.reply('Dziękuje za odpowiedź.') return True else: if(len(pliki) < 5): message.reply('Co tak skromnie? Podaj więcej plików, które chesz synchronizować - wpisz np.: /sync mojPlik.php robertaPlik.php') return False sync = Sync.all() sync.filter("jid =", jid) sync.order("-__key__") item = sync.fetch(1) if len(item) > 0: t = datetime.datetime(*time.strptime(str(item[0].created).split('.')[0],"%Y-%m-%d %H:%M:%S")[0:5]) difference = datetime.datetime.now() - t minutes, seconds = divmod(difference.seconds, 60) logging.info('SYNC diff: %s' % (minutes)) if settings.SYNC_LIMIT_MIN > minutes: message.reply('W ciągu ostatnich %s minut synchronizowałeś już pliki. Odczekaj troszkę i daj odpocząć serwerom :)' % (settings.SYNC_LIMIT_MIN)) return False r = Roster.all() r.filter("jid !=",jid) r.filter("syncCmd =",True) items = r.fetch(settings.BROADCAST_USERS_LIMIT) if(len(items) == 0): message.reply('Brak osób które mogłyby odpowiedzieć na Twoją synchronizację (wszyscy wyłączyli sobie chęć odbierania tego typu powiadomień?).') return False sync = Sync(jid=jid,files=pliki) sync.put() usersOnline = 0 p = PresenceStatus.all(keys_only=True) p.filter("online =",True) usersOnline = p.count() - 1 if p.count() > 0 else 0 # Informacja o synchro została wysłana do 5 osób (w tym 2 Idle) <-- tu powinno byc sprawdzone kto jest online message.reply('Informacja o synchro została wysłana do %s osób (w tym %s online). Jeżeli w przeciągu %s minut ktoś odpowie na Twoją prośbę zostaniesz o tym automatycznie poinformowany.' % (len(items),usersOnline,settings.SYNC_LIMIT_MIN)) jids = [] for item in items: jids.append(item.jid) msg = u'SYNC: %s\nPowyższe pliki zostaną synchronizowane przez %s. Czy wyrażasz na to zgodę? Odpowiedz: /sync tak|ok|yes jeżeli nie masz nic przeciwko lub /sync nie|no jeżeli synchronizacja ma zostać przerwana.' xmpp.send_message(jids,msg % (pliki,jid),None,xmpp.MESSAGE_TYPE_CHAT)