package tracker;
import java.io.File;

import object.TTorent;
import object.TransRecord;
public interface TrackerInterface{
    public boolean AddUpLoad(String userid,int upload);//给用户新增上传量，返回0成功，返回1失败;
    public boolean ReduceUpLoad(String userid,int upload);//给用户减上传量，返回0成功，返回1失败;
    public boolean AddDownload(String userid,int download);//给用户增加下载量，返回0成功，返回1失败;
    public boolean ReduceDownload(String userid,int download);//给用户减少下载量，返回0成功，返回1失败;
    public boolean AddMagic(String userid,int magic);//给用户增加魔力值，返回0成功，返回1失败;
    public boolean ReduceMagic(String userid,int magic);//给用户减少魔力值，返回0成功，返回1失败;

    public TTorent ReadTorrent(File torrent);//传入torrent文件，解析后返回TTorent类
    public int SaveTorrent(TTorent seed,String seedid);//保存seedid对应的ttorent信息
    public File GetTTorent(String seedid,String userid);//根据种子id获得ttorent信息然后构建Ttorent文件并返回,同时记录用户的下载行为

    public int AddRecord(String seedid,TransRecord rd);//新增一个seedid对应的种子的传输任务记录
}