public void subscribeUsersFinished(int type)
			throws InvalidSubscriptionException, IOException {
		
		usersHaveData = 1;
		String tmp;
		final int nonce;
		if (type == FINISHED_DEC_HAND) {
			tmp = HAVE_MY_HAND;
			nonce = SigService.HAVE_HAND_NONCE;
		} else if (type == FINISHED_DEC_COM_CARDS) {
			tmp = REQUEST_RAW_COMMUNITY_CARDS;
			nonce = SigService.REQUEST_COM_CARDS_NONCE;
		} else {
			tmp = RAW_COMMUNITY_CARDS_VERIFIED;
			nonce = SigService.VERIFY_COM_CARDS_NONCE;
		}
		waiterSub = elvin.subscribe(NOT_TYPE + " == '" + tmp + "' && "
				+ GAME_ID + " == '" + gameHost.getID() + "'");

		waiterSub.addListener(new NotificationListener() {
			public void notificationReceived(NotificationEvent e) {

				String userid = e.notification.getString(SOURCE_USER);

				User tmpUser = findUserByID(userid);

				if (tmpUser == null) {
					// not in our list so return
					return;
				}

				try {
					if (sigServ.validateVerifiedSignature(
							(byte[]) e.notification.get(SIGNATURE),
							tmpUser.getPublicKey(), nonce)) {
						// signature validated so this is a real cheat
						// notification
						usersHaveData++;
						if (usersHaveData >= currentGameMembers.size()) {
							// remove subscription and return
							waiterSub.remove();
							return;
						}

					} else {
						// call cheat
					}
				} catch (Exception e1) {
					// call cheat
				}
			}
		});

		return;
	}