Пример #1
0
	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()
Пример #2
0
	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
Пример #3
0
	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)