GH-1217 add simple instance play time tracking
Not reliable in the face of crashes... but what is?
This commit is contained in:
		@@ -38,6 +38,7 @@ BaseInstance::BaseInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr s
 | 
			
		||||
	connect(ENV.icons().get(), SIGNAL(iconUpdated(QString)), SLOT(iconUpdated(QString)));
 | 
			
		||||
	m_settings->registerSetting("notes", "");
 | 
			
		||||
	m_settings->registerSetting("lastLaunchTime", 0);
 | 
			
		||||
	m_settings->registerSetting("totalTimePlayed", 0);
 | 
			
		||||
 | 
			
		||||
	// Custom Commands
 | 
			
		||||
	auto commandSetting = m_settings->registerSetting({"OverrideCommands","OverrideLaunchCmd"}, false);
 | 
			
		||||
@@ -93,9 +94,31 @@ bool BaseInstance::isRunning() const
 | 
			
		||||
 | 
			
		||||
void BaseInstance::setRunning(bool running)
 | 
			
		||||
{
 | 
			
		||||
	if(running && !m_isRunning)
 | 
			
		||||
	{
 | 
			
		||||
		m_timeStarted = QDateTime::currentDateTime();
 | 
			
		||||
	}
 | 
			
		||||
	else if(!running && m_isRunning)
 | 
			
		||||
	{
 | 
			
		||||
		qint64 current = settings()->get("totalTimePlayed").toLongLong();
 | 
			
		||||
		QDateTime timeEnded = QDateTime::currentDateTime();
 | 
			
		||||
		settings()->set("totalTimePlayed", current + m_timeStarted.secsTo(timeEnded));
 | 
			
		||||
		emit propertiesChanged(this);
 | 
			
		||||
	}
 | 
			
		||||
	m_isRunning = running;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int64_t BaseInstance::totalTimePlayed()
 | 
			
		||||
{
 | 
			
		||||
	qint64 current = settings()->get("totalTimePlayed").toLongLong();
 | 
			
		||||
	if(m_isRunning)
 | 
			
		||||
	{
 | 
			
		||||
		QDateTime timeNow = QDateTime::currentDateTime();
 | 
			
		||||
		return current + m_timeStarted.secsTo(timeNow);
 | 
			
		||||
	}
 | 
			
		||||
	return current;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString BaseInstance::instanceType() const
 | 
			
		||||
{
 | 
			
		||||
	return m_settings->get("InstanceType").toString();
 | 
			
		||||
 
 | 
			
		||||
@@ -71,6 +71,7 @@ public:
 | 
			
		||||
 | 
			
		||||
	void setRunning(bool running);
 | 
			
		||||
	bool isRunning() const;
 | 
			
		||||
	int64_t totalTimePlayed();
 | 
			
		||||
 | 
			
		||||
	/// get the type of this instance
 | 
			
		||||
	QString instanceType() const;
 | 
			
		||||
@@ -190,6 +191,8 @@ public:
 | 
			
		||||
	/// get variables this instance exports
 | 
			
		||||
	virtual QMap<QString, QString> getVariables() const = 0;
 | 
			
		||||
 | 
			
		||||
	virtual QString typeName() const = 0;
 | 
			
		||||
 | 
			
		||||
	enum InstanceFlag
 | 
			
		||||
	{
 | 
			
		||||
		VersionBrokenFlag = 0x01,
 | 
			
		||||
@@ -230,6 +233,7 @@ protected:
 | 
			
		||||
	SettingsObjectPtr m_settings;
 | 
			
		||||
	InstanceFlags m_flags;
 | 
			
		||||
	bool m_isRunning = false;
 | 
			
		||||
	QDateTime m_timeStarted;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Q_DECLARE_METATYPE(std::shared_ptr<BaseInstance>)
 | 
			
		||||
 
 | 
			
		||||
@@ -78,4 +78,8 @@ public:
 | 
			
		||||
	{
 | 
			
		||||
		return instanceRoot();
 | 
			
		||||
	}
 | 
			
		||||
	virtual QString typeName() const
 | 
			
		||||
	{
 | 
			
		||||
		return "Null";
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -7,15 +7,6 @@ LegacyFTBInstance::LegacyFTBInstance(SettingsObjectPtr globalSettings, SettingsO
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString LegacyFTBInstance::getStatusbarDescription()
 | 
			
		||||
{
 | 
			
		||||
	if (flags() & VersionBrokenFlag)
 | 
			
		||||
	{
 | 
			
		||||
		return "Legacy FTB: " + intendedVersionId() + " (broken)";
 | 
			
		||||
	}
 | 
			
		||||
	return "Legacy FTB: " + intendedVersionId();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString LegacyFTBInstance::id() const
 | 
			
		||||
{
 | 
			
		||||
	return "FTB/" + BaseInstance::id();
 | 
			
		||||
@@ -29,3 +20,8 @@ void LegacyFTBInstance::copy(const QDir &newDir)
 | 
			
		||||
	QString inst_type = settings_obj.get("InstanceType").toString();
 | 
			
		||||
	settings_obj.set("InstanceType", "Legacy");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString LegacyFTBInstance::typeName() const
 | 
			
		||||
{
 | 
			
		||||
	return tr("Legacy FTB");
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ class LegacyFTBInstance : public LegacyInstance
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
	explicit LegacyFTBInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr settings, const QString &rootDir);
 | 
			
		||||
	virtual QString getStatusbarDescription();
 | 
			
		||||
	virtual QString id() const;
 | 
			
		||||
	virtual void copy(const QDir &newDir);
 | 
			
		||||
	virtual QString typeName() const;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -125,18 +125,14 @@ void OneSixFTBInstance::createProfile()
 | 
			
		||||
	m_version.reset(new MinecraftProfile(new FTBProfileStrategy(this)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString OneSixFTBInstance::getStatusbarDescription()
 | 
			
		||||
{
 | 
			
		||||
	if (flags() & VersionBrokenFlag)
 | 
			
		||||
	{
 | 
			
		||||
		return "OneSix FTB: " + intendedVersionId() + " (broken)";
 | 
			
		||||
	}
 | 
			
		||||
	return "OneSix FTB: " + intendedVersionId();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<Task> OneSixFTBInstance::createUpdateTask()
 | 
			
		||||
{
 | 
			
		||||
	return OneSixInstance::createUpdateTask();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString OneSixFTBInstance::typeName() const
 | 
			
		||||
{
 | 
			
		||||
	return tr("OneSix FTB");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include "OneSixFTBInstance.moc"
 | 
			
		||||
 
 | 
			
		||||
@@ -15,8 +15,6 @@ public:
 | 
			
		||||
 | 
			
		||||
	virtual void createProfile();
 | 
			
		||||
 | 
			
		||||
	virtual QString getStatusbarDescription();
 | 
			
		||||
 | 
			
		||||
	virtual std::shared_ptr<Task> createUpdateTask() override;
 | 
			
		||||
 | 
			
		||||
	virtual QString id() const;
 | 
			
		||||
@@ -24,6 +22,8 @@ public:
 | 
			
		||||
	QDir librariesPath() const override;
 | 
			
		||||
	QDir versionsPath() const override;
 | 
			
		||||
	bool providesVersionFile() const override;
 | 
			
		||||
	virtual QString typeName() const;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	SettingsObjectPtr m_globalSettings;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -445,16 +445,12 @@ QString LegacyInstance::defaultCustomBaseJar() const
 | 
			
		||||
	return PathCombine(binDir(), "mcbackup.jar");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString LegacyInstance::getStatusbarDescription()
 | 
			
		||||
{
 | 
			
		||||
	if (flags() & VersionBrokenFlag)
 | 
			
		||||
	{
 | 
			
		||||
		return tr("Legacy : %1 (broken)").arg(intendedVersionId());
 | 
			
		||||
	}
 | 
			
		||||
	return tr("Legacy : %1").arg(intendedVersionId());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString LegacyInstance::lwjglFolder() const
 | 
			
		||||
{
 | 
			
		||||
	return m_lwjglFolderSetting->get().toString();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString LegacyInstance::typeName() const
 | 
			
		||||
{
 | 
			
		||||
	return tr("Legacy");
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -120,7 +120,7 @@ public:
 | 
			
		||||
 | 
			
		||||
	virtual void cleanupAfterRun() override;
 | 
			
		||||
 | 
			
		||||
	virtual QString getStatusbarDescription() override;
 | 
			
		||||
	virtual QString typeName() const;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	mutable std::shared_ptr<ModList> jar_mod_list;
 | 
			
		||||
 
 | 
			
		||||
@@ -305,4 +305,46 @@ QString MinecraftInstance::getLogFileRoot()
 | 
			
		||||
	return minecraftRoot();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString MinecraftInstance::prettifyTimeDuration(int64_t duration)
 | 
			
		||||
{
 | 
			
		||||
	int seconds = (int) (duration % 60);
 | 
			
		||||
	duration /= 60;
 | 
			
		||||
	int minutes = (int) (duration % 60);
 | 
			
		||||
	duration /= 60;
 | 
			
		||||
	int hours = (int) (duration % 24);
 | 
			
		||||
	int days = (int) (duration / 24);
 | 
			
		||||
	if((hours == 0)&&(days == 0))
 | 
			
		||||
	{
 | 
			
		||||
		return tr("%1m %2s").arg(minutes).arg(seconds);
 | 
			
		||||
	}
 | 
			
		||||
	if (days == 0)
 | 
			
		||||
	{
 | 
			
		||||
		return tr("%1h %2m").arg(hours).arg(minutes);
 | 
			
		||||
	}
 | 
			
		||||
	return tr("%1d %2h %3m").arg(days).arg(hours).arg(minutes);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString MinecraftInstance::getStatusbarDescription()
 | 
			
		||||
{
 | 
			
		||||
	QStringList traits;
 | 
			
		||||
	if (flags() & VersionBrokenFlag)
 | 
			
		||||
	{
 | 
			
		||||
		traits.append(tr("broken"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	QString description;
 | 
			
		||||
	description.append(tr("Minecraft %1 (%2)").arg(intendedVersionId()).arg(typeName()));
 | 
			
		||||
	if(totalTimePlayed() > 0)
 | 
			
		||||
	{
 | 
			
		||||
		description.append(tr(", played for %1").arg(prettifyTimeDuration(totalTimePlayed())));
 | 
			
		||||
	}
 | 
			
		||||
	/*
 | 
			
		||||
	if(traits.size())
 | 
			
		||||
	{
 | 
			
		||||
		description.append(QString(" (%1)").arg(traits.join(", ")));
 | 
			
		||||
	}
 | 
			
		||||
	*/
 | 
			
		||||
	return description;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include "MinecraftInstance.moc"
 | 
			
		||||
 
 | 
			
		||||
@@ -55,8 +55,12 @@ public:
 | 
			
		||||
 | 
			
		||||
	virtual QString getLogFileRoot() override;
 | 
			
		||||
 | 
			
		||||
	virtual QString getStatusbarDescription() override;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	QMap<QString, QString> createCensorFilterFromSession(AuthSessionPtr session);
 | 
			
		||||
private:
 | 
			
		||||
	QString prettifyTimeDuration(int64_t duration);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef std::shared_ptr<MinecraftInstance> MinecraftInstancePtr;
 | 
			
		||||
 
 | 
			
		||||
@@ -476,24 +476,6 @@ std::shared_ptr<MinecraftProfile> OneSixInstance::getMinecraftProfile() const
 | 
			
		||||
	return m_version;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString OneSixInstance::getStatusbarDescription()
 | 
			
		||||
{
 | 
			
		||||
	QStringList traits;
 | 
			
		||||
	if (flags() & VersionBrokenFlag)
 | 
			
		||||
	{
 | 
			
		||||
		traits.append(tr("broken"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (traits.size())
 | 
			
		||||
	{
 | 
			
		||||
		return tr("Minecraft %1 (%2)").arg(intendedVersionId()).arg(traits.join(", "));
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		return tr("Minecraft %1").arg(intendedVersionId());
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QDir OneSixInstance::librariesPath() const
 | 
			
		||||
{
 | 
			
		||||
	return QDir::current().absoluteFilePath("libraries");
 | 
			
		||||
@@ -590,3 +572,8 @@ std::shared_ptr<OneSixInstance> OneSixInstance::getSharedPtr()
 | 
			
		||||
{
 | 
			
		||||
	return std::dynamic_pointer_cast<OneSixInstance>(BaseInstance::getSharedPtr());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString OneSixInstance::typeName() const
 | 
			
		||||
{
 | 
			
		||||
	return tr("OneSix");
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -79,8 +79,6 @@ public:
 | 
			
		||||
	/// get the current full version info
 | 
			
		||||
	std::shared_ptr<MinecraftProfile> getMinecraftProfile() const;
 | 
			
		||||
 | 
			
		||||
	virtual QString getStatusbarDescription() override;
 | 
			
		||||
 | 
			
		||||
	virtual QDir jarmodsPath() const;
 | 
			
		||||
	virtual QDir librariesPath() const;
 | 
			
		||||
	virtual QDir versionsPath() const;
 | 
			
		||||
@@ -92,6 +90,8 @@ public:
 | 
			
		||||
 | 
			
		||||
	std::shared_ptr<OneSixInstance> getSharedPtr();
 | 
			
		||||
 | 
			
		||||
	virtual QString typeName() const;
 | 
			
		||||
 | 
			
		||||
signals:
 | 
			
		||||
	void versionReloaded();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user